Python 3.4 从CSV格式读取
Python 3.4 reading from CSV formats
好的所以我在 Python 中有这段代码,我从 csv 文件导入,问题是 csv 文件中的列不是基本数字。一列是 "INT, EXT" 格式的文本,一列是从“0:00 到 11:59”格式的点钟格式。我有第三列作为“00.00”格式的正常数字距离。
我的问题是如何绘制距离与时钟的关系,然后根据一个是 INT 还是 EXT 来更改散点图的点的颜色。
我的第一个问题是如何让程序读取时钟格式。和来自 csv 的文本格式。
有什么想法或建议吗?提前致谢
这是我尝试导入的 CSV 示例
ML INT .10 534.15 0:00
ML EXT .25 654.23 3:00
ML INT .35 743.12 6:30
我想绘制第 4 列作为 x 轴,第 5 列作为 y 轴
我还想将散点图的点颜色编码为红色或蓝色,具体取决于是 INT 还是 EXT
这是我目前拥有的代码示例
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
style.use('ggplot')
a,b,c,d = np.loadtxt('numbers.csv',
unpack = True,
delimiter = ',')
plt.scatter(a,b)
plt.title('Charts')
plt.ylabel('Y Axis')
plt.xlabel('X Axis')
plt.show()
使用 pandas 从您的示例 csv 中读取:
import pandas as pd
import matplotlib.pyplot as plt
import datetime
data = pd.read_csv('data.csv', sep='\t', header=None)
print data
打印:
0 1 2 3 4
0 ML INT 0.10 534.15 0:00
1 ML EXT 0.25 654.23 3:00
2 ML INT 0.35 743.12 6:30
然后将 'INT' 与 'EXT' 分开:
ints = data[data[1]=='INT']
exts = data[data[1]=='EXT']
将它们更改为日期时间并获取距离:
int_times = [datetime.datetime.time(datetime.datetime.strptime(t, '%H:%M')) for t in ints[4]]
ext_times = [datetime.datetime.time(datetime.datetime.strptime(t, '%H:%M')) for t in exts[4]]
int_dist = [d for d in ints[3]]
ext_dist = [d for d in exts[3]]
然后分别绘制 'INT' 和 'EXT' 的散点图:
fig, ax = plt.subplots()
ax.scatter(int_dist, int_times, c='orange', s=150)
ax.scatter(ext_dist, ext_times, c='black', s=150)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.show()
编辑:添加代码以回答评论中有关如何将时间更改为 12 小时格式的问题(范围从 0:00 到 11:59 ) 并去掉秒数。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data = pd.read_csv('data.csv', header=None)
ints = data[data[1]=='INT']
exts = data[data[1]=='EXT']
INT_index = data[data[1]=='INT'].index
EXT_index = data[data[1]=='EXT'].index
time = [t for t in data[4]]
int_dist = [d for d in ints[3]]
ext_dist = [d for d in exts[3]]
fig, ax = plt.subplots()
ax.scatter(int_dist, INT_index, c='orange', s=150)
ax.scatter(ext_dist, EXT_index, c='black', s=150)
ax.set_yticks(np.arange(len(data[4])))
ax.set_yticklabels(time)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.ylabel('Time')
plt.show()
我已经为此做了另一个答案,但我会保留原来的答案,因为我认为它仍然很好,只是没有完全回答你的特定问题。
我还生成了更多的数据行来使这个问题(至少对我而言)更有意义。
为我解决这个问题的是生成第 5 列(在代码中,而不是 csv 中),它是对应于特定点钟时间的分钟数,即 11:59 映射到 719 分钟。使用 pandas 我将这个新列插入到数据框中。然后我可以每 60 分钟放置一个每小时的字符串标记标签('0:00'、'1:00' 等)。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data = pd.read_csv('Workbook2.csv', header=None)
print data
打印我伪造的数据:
0 1 2 3 4
0 ML INT 0.10 534.15 0:00
1 ML EXT 0.25 654.23 3:00
2 ML INT 0.30 743.12 6:30
3 ML EXT 0.35 744.20 4:30
4 ML INT 0.45 811.47 7:00
5 ML EXT 0.55 777.90 5:45
6 ML INT 0.66 854.70 7:54
7 ML EXT 0.74 798.40 6:55
8 ML INT 0.87 947.30 11:59
现在创建一个将点钟转换为分钟的函数:
def convert_to_min(o_clock):
h, m = o_clock.split(':')
return int(h) * 60 + int(m)
# using this function create a list times in minutes for each time in col 4
min_col = [convert_to_min(t) for t in data[4]]
data[5] = min_col # inserts this list as a new column '5'
print data
我们的新数据:
0 1 2 3 4 5
0 ML INT 0.10 534.15 0:00 0
1 ML EXT 0.25 654.23 3:00 180
2 ML INT 0.30 743.12 6:30 390
3 ML EXT 0.35 744.20 4:30 270
4 ML INT 0.45 811.47 7:00 420
5 ML EXT 0.55 777.90 5:45 345
6 ML INT 0.66 854.70 7:54 474
7 ML EXT 0.74 798.40 6:55 415
8 ML INT 0.87 947.30 11:59 719
现在构建 x 和 y 轴数据、刻度标签和刻度位置:
INTs = data[data[1]=='INT']
EXTs = data[data[1]=='EXT']
int_dist = INTs[3] # x-axis data for INT
ext_dist = EXTs[3]
# plotting time as minutes in range [0 720]
int_time = INTs[5] # y-axis data for INT
ext_time = EXTs[5]
time = ['0:00', '1:00', '2:00', '3:00', '4:00', '5:00',
'6:00', '7:00', '8:00', '9:00', '10:00', '11:00', '12:00']
# this will place the strings above at every 60 min
tick_location = [t*60 for t in range(13)]
现在剧情:
fig, ax = plt.subplots()
ax.scatter(int_dist, int_time, c='orange', s=150)
ax.scatter(ext_dist, ext_time, c='black', s=150)
ax.set_yticks(tick_location)
ax.set_yticklabels(time)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.ylabel('Time')
plt.title('Seems to work...')
plt.show()
好的所以我在 Python 中有这段代码,我从 csv 文件导入,问题是 csv 文件中的列不是基本数字。一列是 "INT, EXT" 格式的文本,一列是从“0:00 到 11:59”格式的点钟格式。我有第三列作为“00.00”格式的正常数字距离。
我的问题是如何绘制距离与时钟的关系,然后根据一个是 INT 还是 EXT 来更改散点图的点的颜色。
我的第一个问题是如何让程序读取时钟格式。和来自 csv 的文本格式。
有什么想法或建议吗?提前致谢
这是我尝试导入的 CSV 示例
ML INT .10 534.15 0:00
ML EXT .25 654.23 3:00
ML INT .35 743.12 6:30
我想绘制第 4 列作为 x 轴,第 5 列作为 y 轴 我还想将散点图的点颜色编码为红色或蓝色,具体取决于是 INT 还是 EXT
这是我目前拥有的代码示例
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
style.use('ggplot')
a,b,c,d = np.loadtxt('numbers.csv',
unpack = True,
delimiter = ',')
plt.scatter(a,b)
plt.title('Charts')
plt.ylabel('Y Axis')
plt.xlabel('X Axis')
plt.show()
使用 pandas 从您的示例 csv 中读取:
import pandas as pd
import matplotlib.pyplot as plt
import datetime
data = pd.read_csv('data.csv', sep='\t', header=None)
print data
打印:
0 1 2 3 4
0 ML INT 0.10 534.15 0:00
1 ML EXT 0.25 654.23 3:00
2 ML INT 0.35 743.12 6:30
然后将 'INT' 与 'EXT' 分开:
ints = data[data[1]=='INT']
exts = data[data[1]=='EXT']
将它们更改为日期时间并获取距离:
int_times = [datetime.datetime.time(datetime.datetime.strptime(t, '%H:%M')) for t in ints[4]]
ext_times = [datetime.datetime.time(datetime.datetime.strptime(t, '%H:%M')) for t in exts[4]]
int_dist = [d for d in ints[3]]
ext_dist = [d for d in exts[3]]
然后分别绘制 'INT' 和 'EXT' 的散点图:
fig, ax = plt.subplots()
ax.scatter(int_dist, int_times, c='orange', s=150)
ax.scatter(ext_dist, ext_times, c='black', s=150)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.show()
编辑:添加代码以回答评论中有关如何将时间更改为 12 小时格式的问题(范围从 0:00 到 11:59 ) 并去掉秒数。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data = pd.read_csv('data.csv', header=None)
ints = data[data[1]=='INT']
exts = data[data[1]=='EXT']
INT_index = data[data[1]=='INT'].index
EXT_index = data[data[1]=='EXT'].index
time = [t for t in data[4]]
int_dist = [d for d in ints[3]]
ext_dist = [d for d in exts[3]]
fig, ax = plt.subplots()
ax.scatter(int_dist, INT_index, c='orange', s=150)
ax.scatter(ext_dist, EXT_index, c='black', s=150)
ax.set_yticks(np.arange(len(data[4])))
ax.set_yticklabels(time)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.ylabel('Time')
plt.show()
我已经为此做了另一个答案,但我会保留原来的答案,因为我认为它仍然很好,只是没有完全回答你的特定问题。
我还生成了更多的数据行来使这个问题(至少对我而言)更有意义。
为我解决这个问题的是生成第 5 列(在代码中,而不是 csv 中),它是对应于特定点钟时间的分钟数,即 11:59 映射到 719 分钟。使用 pandas 我将这个新列插入到数据框中。然后我可以每 60 分钟放置一个每小时的字符串标记标签('0:00'、'1:00' 等)。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data = pd.read_csv('Workbook2.csv', header=None)
print data
打印我伪造的数据:
0 1 2 3 4
0 ML INT 0.10 534.15 0:00
1 ML EXT 0.25 654.23 3:00
2 ML INT 0.30 743.12 6:30
3 ML EXT 0.35 744.20 4:30
4 ML INT 0.45 811.47 7:00
5 ML EXT 0.55 777.90 5:45
6 ML INT 0.66 854.70 7:54
7 ML EXT 0.74 798.40 6:55
8 ML INT 0.87 947.30 11:59
现在创建一个将点钟转换为分钟的函数:
def convert_to_min(o_clock):
h, m = o_clock.split(':')
return int(h) * 60 + int(m)
# using this function create a list times in minutes for each time in col 4
min_col = [convert_to_min(t) for t in data[4]]
data[5] = min_col # inserts this list as a new column '5'
print data
我们的新数据:
0 1 2 3 4 5
0 ML INT 0.10 534.15 0:00 0
1 ML EXT 0.25 654.23 3:00 180
2 ML INT 0.30 743.12 6:30 390
3 ML EXT 0.35 744.20 4:30 270
4 ML INT 0.45 811.47 7:00 420
5 ML EXT 0.55 777.90 5:45 345
6 ML INT 0.66 854.70 7:54 474
7 ML EXT 0.74 798.40 6:55 415
8 ML INT 0.87 947.30 11:59 719
现在构建 x 和 y 轴数据、刻度标签和刻度位置:
INTs = data[data[1]=='INT']
EXTs = data[data[1]=='EXT']
int_dist = INTs[3] # x-axis data for INT
ext_dist = EXTs[3]
# plotting time as minutes in range [0 720]
int_time = INTs[5] # y-axis data for INT
ext_time = EXTs[5]
time = ['0:00', '1:00', '2:00', '3:00', '4:00', '5:00',
'6:00', '7:00', '8:00', '9:00', '10:00', '11:00', '12:00']
# this will place the strings above at every 60 min
tick_location = [t*60 for t in range(13)]
现在剧情:
fig, ax = plt.subplots()
ax.scatter(int_dist, int_time, c='orange', s=150)
ax.scatter(ext_dist, ext_time, c='black', s=150)
ax.set_yticks(tick_location)
ax.set_yticklabels(time)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.ylabel('Time')
plt.title('Seems to work...')
plt.show()