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

Pandas DateTimeIndex多分组/重采样聚合:按月计算30分钟间隔均值

解决按月计算30分钟时段均值的问题

嘿,我来帮你搞定这个需求!你之前尝试的链式重采样没达到预期,大概率是因为这种方式没法同时保留「月份」和「一天中的30分钟时段」这两个关键分组维度。咱们换个思路,直接按这两个维度分组计算,就能精准得到每个月内同一30分钟时段的均值了。

核心思路

我们需要把数据按两个维度分组:

  • 带年份的月份(避免把2023年1月和2024年1月的数据混在一起)
  • 一天中的30分钟具体时段(比如00:00、00:30…23:30)

然后对每个分组内的数据求均值,就刚好符合你的要求。

具体代码实现

假设你的DataFrame名为df,包含需要计算均值的数值列(比如value),且已经有正确的DateTimeIndex:

# 1. 按「年月周期」和「一天中的时段」分组,计算均值
df_monthly_period_mean = df.groupby([
    df.index.to_period('M'),  # 提取带年份的月份,比如2023-01、2023-02
    df.index.time             # 提取一天中的具体时间点,比如datetime.time(0,0)、datetime.time(0,30)
]).mean()

# 2. (可选)将结果整理成更直观的格式:月份作为行,时段作为列
df_pivoted = df_monthly_period_mean.unstack(level=1)

关键细节解释

  • to_period('M'):把每个时间戳转换成对应的年月周期,这能确保不同年份的同一个月(比如2023-12和2024-12)被当成独立分组,不会混淆。
  • index.time:直接提取时间戳中的「时分」部分,刚好对应你需要的30分钟间隔时段,每个时段会被单独分组计算。
  • 如果你之前用的是类似df.resample('M').resample('30T').mean()的链式操作,这种方式是错误的——第一次按月重采样后,每个月只剩一个汇总数据点,再按30分钟重采样根本没有意义,自然得不到预期结果。

可选优化:调整索引格式

如果想把结果的年月周期索引转换成具体的日期(比如月初),可以加这一步:

# 将年月周期转换为当月第一天的日期作为索引
df_pivoted.index = df_pivoted.index.to_timestamp('M')

这样你就能得到一行对应一个月、一列对应一个30分钟时段的清晰表格啦!

内容的提问来源于stack exchange,提问作者SciGuyMcQ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:06:29