按照一天中的时间对数据进行分组

3

我有一个带有日期时间索引的数据框:df.head(6)

                          NUMBERES              PRICE    
DEAL_TIME
2015-03-02 12:40:03              5                 25   
2015-03-04 14:52:57              7                 23   
2015-03-03 08:10:09             10                 43   
2015-03-02 20:18:24              5                 37   
2015-03-05 07:50:55              4                 61   
2015-03-02 09:08:17              1                 17   

数据框包含一周的数据。现在我需要计算每天的时间段。如果时间段为1小时,则以下方法适用:
df_grouped = df.groupby(df.index.hour).count()

但是我不知道当时间段为半小时时应该如何处理。我该如何实现它?

更新:

有人告诉我这个问题类似于如何按时间段分组DataFrame?

但我已经尝试过提到的方法。也许是我的问题没有说清楚。'DEAL_TIME'范围从'2015-03-02 00:00:00'到'2015-03-08 23:59:59'。如果我使用pd.TimeGrouper(freq='30Min')resample(),时间段将从'2015-03-02 00:30'到'2015-03-08 23:30'。但我想要的是以下系列:

              COUNT      
DEAL_TIME
00:00:00         53 
00:30:00         49 
01:00:00         31
01:30:00         22
02:00:00          1
02:30:00         24
03:00:00         27
03:30:00         41
04:00:00         41
04:30:00         76
05:00:00         33
05:30:00         16
06:00:00         15
06:30:00          4
07:00:00         60
07:30:00         85
08:00:00          3
08:30:00         37
09:00:00         18
09:30:00         29
10:00:00         31
10:30:00         67
11:00:00         35
11:30:00         60
12:00:00         95
12:30:00         37
13:00:00         30
13:30:00         62
14:00:00         58
14:30:00         44
15:00:00         45
15:30:00         35
16:00:00         94
16:30:00         56
17:00:00         64
17:30:00         43
18:00:00         60
18:30:00         52
19:00:00         14
19:30:00          9
20:00:00         31
20:30:00         71
21:00:00         21
21:30:00         32
22:00:00         61
22:30:00         35
23:00:00         14
23:30:00         21

换句话说,时间段与日期无关。

1
类似问题: https://dev59.com/7Ggu5IYBdhLWcg3wy558 - lavina
我又编辑了我的问题。谢谢关注! - J Huang
因此,我投票支持重新开放这个问题。 - DYZ
2个回答

4
您需要一个30分钟的时间分组器来完成此任务:
grouper = pd.TimeGrouper(freq="30T")

您还需要从索引中删除“日期”部分:
df.index = df.reset_index()['index'].apply(lambda x: x - pd.Timestamp(x.date()))

现在,您可以仅按时间分组:
df.groupby(grouper).count()

你可以在这里找到有些晦涩的TimeGrouper文档: pandas resample documentation(实际上是resample文档,但两个功能使用相同的规则)。

不,我知道这个方法。请再次阅读我的问题。我有一些更新的内容。 - J Huang
你的方法看起来是正确的。但是在删除“date”后,索引将变为timedelta,Timegrouper()将返回一个ValueError: 从传递的timedeltas推断出的频率为None,不符合传递的频率30T。 - J Huang
是的,索引变成了 timedelta64。但是它不会对分组器造成任何问题(我使用的是 pandas 0.18.1)。结果的第一行是 07:50:55 2 2,如果你想让窗口从00和30分钟开始,可以调整基准。 - DYZ
非常感谢,我受益匪浅。 - J Huang

1
  • 在pandas中,按时间分组的最常见方法是使用.resample()函数。
  • 在v0.18.0中,此函数是两阶段的。

  • 这意味着df.resample('M')会创建一个对象,我们可以对其应用其他函数(如平均值、计数、总和等)

代码片段将如下所示:

df.resample('M').count()

您可以在此处参考示例

谢谢您的回复。但这不是我需要的。请再次阅读我的问题。我有一些更新。 - J Huang
1
很抱歉,这并不是问题的答案。他想要的是一种将所有天按15分钟分组的方法(因此,一个15分钟的区间应该包含所有包括的天内该区间的数据),而不仅仅是连续的15分钟时间段! - meow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接