Pandas:将日期分成 30 分钟间隔并计算平均值
Posted
技术标签:
【中文标题】Pandas:将日期分成 30 分钟间隔并计算平均值【英文标题】:Pandas: Bin dates into 30 minute intervals and calculate averages 【发布时间】:2019-02-24 20:59:25 【问题描述】:我有一个 Pandas 数据框,其中包含两列 speed
和 time
。
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.stats
的binned_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 分钟数据重新采样为每小时平均值:日期问题 [重复]