如何将不同CSV文件的数据绘制到单个图表中,以天为参考的x轴
我写了一段代码,用来把几个CSV文件的数据画到一张图上,x轴是以天为单位的。
CSV 1:
Value
time
2012-02-10 11:03:45 520429.598
2012-07-17 09:12:07 522155.535
... ...
2014-07-19 12:57:36 626192.186
2014-07-19 12:59:52 705789.899
这是3年的数据
CSV 2:
Value
time
2014-02-10 11:03:45 520429.598
2014-02-17 12:12:07 522155.535
... ...
2014-07-19 12:57:36 626192.186
2014-07-19 12:59:52 705789.899
这是6个月的数据
CSV 3:
Value
time
2013-02-10 11:03:45 520429.598
2013-02-17 12:12:07 522155.535
... ...
2014-07-19 12:57:36 626192.186
2014-07-19 12:59:52 705789.899
这是18个月的数据
...
CSV n:
Value
time
2011-11-10 11:03:45 520429.598
2011-11-11 09:12:07 522155.535
... ...
2011-12-18 12:57:36 626192.186
2011-12-19 12:59:52 705789.899
这是2个月的数据
我在把这些数据都画到一张图上时遇到了困难,因为每个CSV文件的开始日期都不一样。所以我想把时间戳转换成天数,这样就可以从第一天开始把所有数据一起画出来,但我没能做到。有没有什么建议呢?
举个例子:CSV文件2(6个月的数据)在时间上会比CSV文件1(3年的数据)短。该怎么做呢?任何提示或者帮助都非常感谢……
data1 = pd.read_csv(path1,names=['time','Value'],sep=',', index_col=0, parse_dates=True, dayfirst=False)
data2 = pd.read_csv(path2,names=['time','Value'],
sep=',', index_col=0, parse_dates=True, dayfirst=False)
...
datan = pd.read_csv(pathn,names=['time','Value'],
sep=',', index_col=0, parse_dates=True, dayfirst=False)
ax1 = pd.rolling_mean(data1['Value'],100).plot()
ax2 = pd.rolling_mean(data2['Value'],100).plot()
...
axn = pd.rolling_mean(datan['Value'],100).plot()
plt.show()
2 个回答
0
把所有的数据放在一个叫做 Dataframe
的东西里,可能是最简单的做法。这样你只需要执行一次像 rolling_mean
这样的命令就可以了。因为你的例子不太好复制,所以可能还得看你的数据到底是怎么结构的。不过,你可以遍历所有的 csv
文件,把每个单独的 Dataframe
收集到一个列表里,或者存一些 id
,然后用 pd.concat
把所有的 Dataframe
合并成一个。之后,像 rolling_mean
这样的命令和其他绘图命令就会变得非常简单。
举个例子:
import pandas as pd
import matplotlib.pyplot as plt
import io
csv1 = io.StringIO("""date time Value
2012-02-10 11:03:45 520429.598
2012-07-17 09:12:07 522155.535
2014-07-19 12:57:36 626192.186
2014-07-19 12:59:52 705789.899""")
csv2 = io.StringIO("""date time Value
2014-02-10 11:03:45 520429.598
2014-02-17 12:12:07 522155.535
2014-07-19 12:57:36 626192.186
2014-07-19 12:59:52 705789.899""")
csv3 = io.StringIO("""date time Value
2013-02-10 11:03:45 520429.598
2013-02-17 12:12:07 522155.535
2014-07-19 12:57:36 626192.186
2014-07-19 12:59:52 705789.899""")
csv4 = io.StringIO("""date time Value
2011-11-10 11:03:45 520429.598
2011-11-11 09:12:07 522155.535
2011-12-18 12:57:36 626192.186
2011-12-19 12:59:52 705789.899""")
csvs = []
for csv in [csv1, csv2, csv3, csv4]:
df = pd.read_csv(csv, delim_whitespace=True, skipinitialspace=True,
index_col='datetime',
parse_dates={'datetime': ['date', 'time']},
dayfirst=False)
csvs.append(df)
dfall = pd.concat(csvs, keys=['csv1', 'csv2', 'csv3', 'csv4'], axis=1)
ax = pd.rolling_mean(dfall, 100, min_periods=1).plot()
0
你可以试试让matplotlib来处理日期,把它们变成你x轴上的坐标。我之前也遇到过类似的问题,最后成功绘制了多个时间序列,日期范围也不一样。
补充:我觉得这个方法应该能满足你的需求。它根据每一行和文件第一行的时间之间的天数差来绘制值。
import pandas as pd
import io
import matplotlib.pyplot as plt
csv1 = io.StringIO(u"""time,Value\n2012-02-10 11:03:45,520429.598\n2013-07-19 12:57:36,626192.186\n2014-07-19 12:59:52,705789.899""")
csv2 = io.StringIO(u"""time,Value\n2013-02-11 11:03:45,420429.598\n2013-05-17 12:12:07,522155.535\n2014-07-19 12:57:36,626192.186\n2014-07-19 12:59:52,705789.899""")
dat1 = pd.read_csv(csv1, parse_dates=['time'])
dat2 = pd.read_csv(csv2, parse_dates=['time'])
dat1['timeDiff'] = (dat1['time'] - dat1['time'][0]).astype('timedelta64[D]')
dat2['timeDiff'] = (dat2['time'] - dat2['time'][0]).astype('timedelta64[D]')
fig,ax = plt.subplots()
ax.plot(dat1['timeDiff'],dat1['Value'])
ax.plot(dat2['timeDiff'],dat2['Value'])
plt.show()