按一天中的时间分组数据

Posted

技术标签:

【中文标题】按一天中的时间分组数据【英文标题】:Group data by time of the day 【发布时间】:2017-08-07 03:27:06 【问题描述】:

我有一个带有日期时间索引的数据框: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()

但是当时间段是半小时时我不知道该怎么做。怎么实现?

更新:

有人告诉我这个问题类似于How to group DataFrame by a period of time?

但我已经尝试过提到的方法。也许是我的错,我没有说清楚。 “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

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

【问题讨论】:

类似问题:***.com/questions/11073609/… 我再次编辑了我的问题。感谢您的关注! 因此我投票重新提出问题。 【参考方案1】:

你需要一个 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 文档,但两个功能使用相同的规则)。

【讨论】:

不,我知道这种方法。请再次阅读我的问题。我有一些更新。 你的方法似乎是有道理的。但是删除“日期”后索引将更改为 timedelta,Timegrouper() 将返回 ValueError: Inferred frequency None from pass timedeltas does not conform to pass frequency 30T. 是的,索引变成了timedelta64。但这不会对石斑鱼造成任何问题(我使用的是 pandas 0.18.1)。结果的第一行是07:50:55 2 2,如果希望窗口从00和30分钟开始,可以调整base。 非常感谢,受益匪浅。【参考方案2】: 在 pandas 中,最常见的按时间分组的方法是使用 .resample() 函数。

在 v0.18.0 中,此功能是两阶段的。

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

代码 sn-p 会是这样的,

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

您可以参考这里example。

【讨论】:

感谢您的回复。但这不是我需要的。请再次阅读我的问题。我有一些更新。 这并不能回答我担心的问题,他正在寻找的是一种在所有日子里按 15 分钟分组的方法(所以一个 15 分钟的间隔应该包含该间隔内的数据)包括天数)不仅仅是连续 15 分钟的伸展运动!

以上是关于按一天中的时间分组数据的主要内容,如果未能解决你的问题,请参考以下文章

python pandas 按一天中的小时求和

按一天中的时间安排网络测功机的数量

按一列两行分组

MDX 持续时间和一天中的时间

R:根据一天中的时间有效地对数据框进行子集化

Pandas groupby 一天中的时间到字典