Pandas:将日期分成 30 分钟间隔并计算平均值

Posted

技术标签:

【中文标题】Pandas:将日期分成 30 分钟间隔并计算平均值【英文标题】:Pandas: Bin dates into 30 minute intervals and calculate averages 【发布时间】:2019-02-24 20:59:25 【问题描述】:

我有一个 Pandas 数据框,其中包含两列 speedtime

speed   date
54.72   1:33:56
49.37   1:33:59
37.03   1:34:03
24.02   7:39:58
28.02   7:40:01
24.04   7:40:04
24.02   7:40:07
25.35   7:40:10
26.69   7:40:13
32.04   7:40:16
28.02   11:05:43
30.71   11:05:46
29.36   11:05:49
18.68   11:05:52
54.72   11:05:55
34.69   10:31:34
25.03   10:31:38
56.04   10:31:40
44.03   10:31:43

我想计算每箱 30 分钟的平均速度。例如,第 4 个 bin (1:31 - 2:00) 期间的平均速度为 (54.72 + 49.37 + 37.03)/3。我曾想过将小时、分钟和秒从 00:00 转换为秒,然后有 1800 秒的垃圾箱。我曾尝试使用 scipy.stats 中的 binned_statistic,但我的主要问题是我找不到根据日期分离箱并获得平均速度的方法。

有什么想法吗?

【问题讨论】:

到目前为止你有什么尝试? @norok2 我曾尝试使用来自scipy.statsbinned_statistic,但我找不到根据日期分离箱并获得平均速度的方法。 docs.scipy.org/doc/scipy/reference/generated/… Time difference within group by objects in Python Pandas的可能重复 @Nihal 我的主要问题是我在上面回答的内容,现在已在问题描述中添加。感谢您在这两种情况下的评论。 这个问题很有用,特别是由 hellpander 给出的答案,但你应该在标题中提到它与根据“日期”列进行分箱有关。否则没有人会找到它。 【参考方案1】:

转换为日期时间并使用pandas.Grouper + Offset Aliases:

df['date'] = pd.to_datetime(df.date)
df.groupby(pd.Grouper(key='date', freq='30min')).mean().dropna()

    speed
date    
2018-09-20 01:30:00     47.040000
2018-09-20 07:30:00     26.311429
2018-09-20 10:30:00     39.947500
2018-09-20 11:00:00     32.298000

【讨论】:

一个很好的解决方案。我唯一需要注意的一点是,您使用datetime 来表示一个实际上并没有与之关联的date 的变量。虽然pd.Grouper 使用datetime 为您提供了您想要的垃圾箱,但当使用timedelta 时,它会创建完全不同的垃圾箱(与Series 中的第一个timedelta 的边缘),因此它可能不太可预测. 是的,您的解决方案更干净。 我确实认为这很棒,而且投票明确表示同意。我只是发现pandas 内置的日期分箱方法往往与箱是从一些“合理”边缘(即从 00:00:00)开始还是从Series 中的最早测量开始不一致。这似乎发生在这里,只是从datetime更改为timedelta,这是一种耻辱。 我相信这是最好的解决方案。我还在下面@ALollz 的答案中保留了pd.to_timedelta,因为我不希望今天的日期出现在我的输出中。【参考方案2】:

由于您的date 列并不是真正的日期,因此将其转换为timedelta 可能更明智,这样您就没有附加日期。

然后,您可以使用dt.floor 分组到 30 分钟的 bin。

import pandas as pd

df['date'] = pd.to_timedelta(df.date)
df.groupby(df.date.dt.floor('30min')).mean()

输出:

              speed
date               
01:30:00  47.040000
07:30:00  26.311429
10:30:00  39.947500
11:00:00  32.298000

【讨论】:

以上是关于Pandas:将日期分成 30 分钟间隔并计算平均值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将 5 分钟数据重新采样为每小时平均值:日期问题 [重复]

Pandas 时间序列:常规 10 分钟窗口内不规则间隔数据的分组和滚动平均值

使用不同的时间间隔合并并填充Pandas中的两个数据帧

计算pandas数据帧中日期时间间隔之间的实例数

计算 20 秒间隔内的平均值并按另一列分组

使用 pandas 的 datetimeindex 在特定日期按分钟和小时提取时间间隔