Pandas:将日期划分为 30 分钟间隔并计算平均值
Pandas: Bin dates into 30 minute intervals and calculate averages
我有一个 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 分钟内每个 bin 的平均速度。例如,第 4 个 bin (1:31 - 2:00) 期间的平均速度为 (54.72 + 49.37 + 37.03)/3。我想过将小时、分钟和秒从 00:00 转换为秒,然后将 bin 设置为 1800 秒。我曾尝试使用 scipy.stats 中的 binned_statistic,但我的主要问题是我找不到一种方法来根据日期分离垃圾箱并获得平均速度。
有什么想法吗?
转换为日期时间并使用 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
由于您的 date
列实际上不是日期,因此将其转换为 timedelta
可能更明智,这样您就不会附加日期。
然后,您可以使用 dt.floor
分组到 30 分钟的区间。
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 数据框,其中有两列,分别是 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 分钟内每个 bin 的平均速度。例如,第 4 个 bin (1:31 - 2:00) 期间的平均速度为 (54.72 + 49.37 + 37.03)/3。我想过将小时、分钟和秒从 00:00 转换为秒,然后将 bin 设置为 1800 秒。我曾尝试使用 scipy.stats 中的 binned_statistic,但我的主要问题是我找不到一种方法来根据日期分离垃圾箱并获得平均速度。
有什么想法吗?
转换为日期时间并使用 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
由于您的 date
列实际上不是日期,因此将其转换为 timedelta
可能更明智,这样您就不会附加日期。
然后,您可以使用 dt.floor
分组到 30 分钟的区间。
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