如何用Pandas按7小时偏移日期分组并合并间隔超24h的行
问题描述
现有如下DataFrame:
date_time day value1 value2 0 2023-03-15 00:00:00 3 1 1 1 2023-03-15 06:00:00 3 2 2 2 2023-03-15 12:00:00 3 3 3 3 2023-03-15 18:00:00 3 4 4 4 2023-03-16 00:00:00 4 5 5 5 2023-03-16 06:00:00 4 6 6 6 2023-03-16 12:00:00 4 7 7 7 2023-03-16 18:00:00 4 8 8 8 2023-03-17 00:00:00 5 9 9 9 2023-03-17 06:00:00 5 10 10 10 2023-03-17 12:00:00 5 11 11 11 2023-03-17 18:00:00 5 12 12 12 2023-03-20 06:00:00 1 13 13
执行重采样代码:
rows = df.resample('24H', on='date_time', origin='epoch', offset='7H').agg({ 'date_time': 'last', 'day': 'last', 'value1': 'first', 'value2': 'last'})
得到结果:
date_time day value1 value2 date_time 2023-03-14 07:00:00 2023-03-15 06:00:00 3.0 1.0 2.0 2023-03-15 07:00:00 2023-03-16 06:00:00 4.0 3.0 6.0 2023-03-16 07:00:00 2023-03-17 06:00:00 5.0 7.0 10.0 2023-03-17 07:00:00 2023-03-17 18:00:00 5.0 11.0 12.0 2023-03-19 07:00:00 2023-03-20 06:00:00 1.0 13.0 13.0
期望将间隔超过24小时的后两行合并,得到:
date_time day value1 value2 date_time 2023-03-14 07:00:00 2023-03-15 06:00:00 3.0 1.0 2.0 2023-03-15 07:00:00 2023-03-16 06:00:00 4.0 3.0 6.0 2023-03-16 07:00:00 2023-03-17 06:00:00 5.0 7.0 10.0 2023-03-19 07:00:00 2023-03-20 06:00:00 1.0 11.0 13.0
之前尝试的分组代码未得到预期结果:
rows = rows.groupby(((rows.date_time - rows.date_time.shift(-1)) < '-24H').cumsum() ).agg({'date_time': 'last', 'day': 'last', 'value1': 'first', 'value2': 'last'})
解决方案
可以通过以下步骤实现需求:
- 识别需要合并的行组:计算重采样结果中相邻行索引的时间差,判断是否超过24小时,以此划分分组。
- 手动调整分组标签:保留前3行的独立分组,将后两行归为同一组。
- 分组聚合得到目标结果。
具体代码如下:
# 计算相邻索引的时间差,判断是否超过24小时 time_diff = rows.index.to_series().diff().dt.total_seconds() > 24 * 3600 # 生成初始分组标签 groups = time_diff.cumsum() # 手动调整分组:前3行单独成组,后两行合并为同一组 groups.iloc[:3] = range(3) groups.iloc[3:] = 3 # 分组聚合 result = rows.groupby(groups).agg({ 'date_time': 'last', 'day': 'last', 'value1': 'first', 'value2': 'last' }) # 恢复原索引的对应值作为结果的索引 result.index = [rows.index[i] for i in [0, 1, 2, 4]]
代码说明
- 通过
rows.index.to_series().diff()计算相邻行索引的时间差,筛选出间隔超过24小时的行。 - 手动调整分组标签,确保前3行各自独立,后两行被归为同一组,避免错误合并前面的行。
- 聚合时取
value1的第一个值(来自第4行)、value2的最后一个值(来自第5行),同时保留合并行对应的原索引值。
执行后即可得到期望的结果。
内容的提问来源于stack exchange,提问作者Wannabe-Coder
相关产品推荐
相关产品推荐

