我在 .csv 文件中有巨大的时间序列数据集。文件中有两列:

  • values :这些是样本值。
  • dttm_utc :这些是收集样本时的时间戳。

  • 我已经使用 pd.read_csv(..., parse_dates=["dttm_utc"]) 将数据导入到 Pandas 中。当我打印 dttm_utc 列的前 50 行时,它们看起来像这样:
    0    2012-01-01 00:05:00
    1    2012-01-01 00:10:00
    2    2012-01-01 00:15:00
    3    2012-01-01 00:20:00
    4    2012-01-01 00:25:00
    5    2012-01-01 00:30:00
    6    2012-01-01 00:35:00
    7    2012-01-01 00:40:00
    8    2012-01-01 00:45:00
    9    2012-01-01 00:50:00
    10   2012-01-01 00:55:00
    11   2012-01-01 01:00:00
    12   2012-01-01 01:05:00
    13   2012-01-01 01:10:00
    14   2012-01-01 01:15:00
    15   2012-01-01 01:20:00
    16   2012-01-01 01:25:00
    17   2012-01-01 01:30:00
    18   2012-01-01 01:35:00
    19   2012-01-01 01:40:00
    20   2012-01-01 01:45:00
    21   2012-01-01 01:50:00
    22   2012-01-01 01:55:00
    23   2012-01-01 02:00:00
    24   2012-01-01 02:05:00
    25   2012-01-01 02:10:00
    26   2012-01-01 02:15:00
    27   2012-01-01 02:20:00
    28   2012-01-01 02:25:00
    29   2012-01-01 02:30:00
    30   2012-01-01 02:35:00
    31   2012-01-01 02:40:00
    32   2012-01-01 02:45:00
    33   2012-01-01 02:50:00
    34   2012-01-01 02:55:00
    35   2012-01-01 03:00:00
    36   2012-01-01 03:05:00
    37   2012-01-01 03:10:00
    38   2012-01-01 03:15:00
    39   2012-01-01 03:20:00
    40   2012-01-01 03:25:00
    41   2012-01-01 03:30:00
    42   2012-01-01 03:35:00
    43   2012-01-01 03:40:00
    44   2012-01-01 03:45:00
    45   2012-01-01 03:50:00
    46   2012-01-01 03:55:00
    47   2012-01-01 04:00:00
    48   2012-01-01 04:05:00
    49   2012-01-01 04:10:00
    Name: dttm_utc, dtype: datetime64[ns]
    

    现在,我想要实现的是:
  • 基本上,我想将数据降采样到每小时。
    我想对第一个小时、第二个小时等的样本求和并求平均值,即我想对编号为 0-10 的行的所有值求和并求平均值,因为它们是在第一个小时收集的,接下来我会喜欢对第 11 行和第 22 行之间的数据求和和求平均值,依此类推。如何使用 pandas 命令实现此目的?

  • 现在采样每 5 分钟进行一次,如果它更改为每 2 或 10 分钟一次,我希望我的解决方案仍然有效。

    最佳答案

    您的示例数据是 Series 但您的问题是询问行的求和和平均值,所以我不清楚您在没有示例数据的情况下要求和和求平均值的内容。

    我认为您感兴趣的是 resampling 但这只能在日期时间列( dttm_utc )在索引中时完成。

    s = pd.Series(pd.DatetimeIndex(start='2012-01-01 00:05:00', periods=50,
                       freq=pd.offsets.Minute(n=5)), name='dttm_utc')
    s.reset_index().set_index('dttm_utc').resample(pd.offsets.Hour()).agg([np.sum, np.mean])
    

    给你这个......但它是一个多索引,使事情变得更加复杂。
                        index
                          sum  mean
    dttm_utc
    2012-01-01 00:00:00    55   5.0
    2012-01-01 01:00:00   198  16.5
    2012-01-01 02:00:00   342  28.5
    2012-01-01 03:00:00   486  40.5
    2012-01-01 04:00:00   144  48.0
    

    如果你想删除多索引(多级列),你可以这样做:
    new_s = s.reset_index().set_index('dttm_utc').resample(pd.offsets.Hour()).agg([np.sum, np.mean])
    new_s.columns = new_s.columns.droplevel(level=0)
    
                         sum  mean
    dttm_utc
    2012-01-01 00:00:00   55   5.0
    2012-01-01 01:00:00  198  16.5
    2012-01-01 02:00:00  342  28.5
    2012-01-01 03:00:00  486  40.5
    2012-01-01 04:00:00  144  48.0
    

    关于python - Pandas:时间序列数据:如何选择一小时、一天或一分钟的行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37266512/

    10-12 16:38
    查看更多