You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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'})
解决方案

可以通过以下步骤实现需求:

  1. 识别需要合并的行组:计算重采样结果中相邻行索引的时间差,判断是否超过24小时,以此划分分组。
  2. 手动调整分组标签:保留前3行的独立分组,将后两行归为同一组。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:06:59