熊猫:将时间序列分组为一天的部分时间

时间:2016-04-15 19:18:25

标签: python pandas time-series

我有一个时间序列,我想分组到time periods of the day。按小时分组很容易:

times = pd.DatetimeIndex(df[datetime_field])
grouped = df.groupby([times.hour])

现在我想分组任意数分钟:

times = pd.DatetimeIndex(df[datetime_field])
grouped = df.groupby(['15M'])

我很高兴看到TimeGrouper课程会接受15M,但我不希望时间序列重新采样为15分钟,我希望它分组在&# 39;一天的时间'箱子大小为15分钟。

我可以添加minute_of_day字段,然后使用pd.cut进行分组,但这很慢并且会复制数据。

非常感谢任何提示。

1 个答案:

答案 0 :(得分:1)

实现这一目标的一种方式(很多):

df.groupby([df.ts.dt.date, df.ts.dt.hour, df.ts.dt.minute//15])

说明:

In [52]: df = pd.DataFrame({'ts':pd.date_range('2016-01-01', freq='1min', periods=10000), 'col': np.random.randint(0,100, len(times))})

In [53]: df.head(10)
Out[53]:
   col                  ts
0   87 2016-01-01 00:00:00
1   89 2016-01-01 00:01:00
2   82 2016-01-01 00:02:00
3   37 2016-01-01 00:03:00
4   80 2016-01-01 00:04:00
5   24 2016-01-01 00:05:00
6   14 2016-01-01 00:06:00
7   32 2016-01-01 00:07:00
8   63 2016-01-01 00:08:00
9   81 2016-01-01 00:09:00

In [56]: df.groupby([df.ts.dt.date, df.ts.dt.hour, df.ts.dt.minute//15]).sum().head(20)
Out[56]:
                  col
ts         ts ts
2016-01-01 0  0   848
              1   716
              2   970
              3   767
           1  0   806
              1   760
              2   745
              3   678
           2  0   783
              1   722
              2   798
              3   713
           3  0   589
              1   773
              2   667
              3   796
           4  0   760
              1   735
              2   846
              3   660