Pandas groupby未正确识别UTC时间区间,求自定义日分组均值方法
解决方案
问题根源
你之前的错误在于直接通过df.index.day分组——这是按**自然日(UTC 00:00-23:59)**的日期部分划分组,完全不符合你需要的“UTC 23:00至次日22:00”自定义日区间逻辑。时区转换操作无法解决核心问题,因为你的需求是基于UTC时间的偏移分组,而非时区转换。
正确实现方法
核心思路是调整时间索引的偏移量,让自定义日区间内的所有时间点映射到同一个分组键,具体有两种简洁的实现方式:
方法一:时间偏移法(推荐)
将每个时间戳加1小时,再按日期分组。这样:
- UTC 2022-10-31 23:00 +1h → 2022-11-01 00:00,日期为2022-11-01
- UTC 2022-11-01 22:00 +1h → 2022-11-01 23:00,日期仍为2022-11-01
- 整个“UTC 2022-10-31 23:00至2022-11-01 22:00”区间的时间点都会被映射到2022-11-01这个分组
代码示例:
import pandas as pd # 确保索引是带UTC时区的datetime类型(如果尚未设置) df.index = pd.to_datetime(df.index, utc=True) # 创建分组键:时间索引加1小时后取日期 group_key = (df.index + pd.Timedelta(hours=1)).date # 按自定义日分组计算col1的均值 daily_mean = df.groupby(group_key)['col1'].mean()
如果需要保留datetime类型的分组标签,可以改用floor('D'):
group_key = (df.index + pd.Timedelta(hours=1)).floor('D') daily_mean = df.groupby(group_key)['col1'].mean()
方法二:小时判断法
通过判断时间戳的小时数,手动调整分组日期:
- 若小时 <23:使用原日期作为分组键
- 若小时 >=23:使用次日日期作为分组键
代码示例:
group_key = df.index.where(df.index.hour < 23, df.index + pd.Timedelta(days=1)).date daily_mean = df.groupby(group_key)['col1'].mean()
验证结果
以你提供的示例数据为例,2022-10-31 23:00会和2022-11-01 00:00~22:00的所有数据被分到同一组,计算出正确的自定义日均值;而2022-11-01 23:00会被分到2022-11-02的组中,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Denver Dang
相关产品推荐
相关产品推荐

