如何将不同CSV文件的数据绘制到单个图表中,以天为参考的x轴

0 投票
2 回答
2613 浏览
提问于 2025-04-18 17:00

我写了一段代码,用来把几个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()

撰写回答