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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:40:25