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

如何在Pandas Grouper分组时保留Datetime列并筛选九月数据?

Pandas分组后筛选九月数据的解决方法

问题背景

现有每分钟更新的Pandas DataFrame结构如下:

Date       Time                 InverterVoltage        Invertercurrent
    2021-11-15 14:37:05              219.1                 20
    2021-11-15 14:38:05              210.2                 21

执行以下代码计算功耗、合并时间列并按小时分组求均值:

# 计算逆变器功耗
df['inverterConsumption'] = df.inverterVoltage * df.inverterCurrent
# 合并生成Datetime列
df['Datetime'] = pd.to_datetime(df['Date'].astype(str) + ' ' + df['Time'].astype(str))
# 按小时分组求均值
davg_df2 = df.groupby(pd.Grouper(freq='H', key='Datetime')).mean()

尝试筛选九月数据时执行:

davg_df2 = davg_df2[davg_df2['Datetime'].dt.month_name() == 'September']

触发KeyError: Datetime,因为分组聚合后Datetime列未保留(非数值型列默认不会被聚合保留,且被设为了索引)。


解决方法

方法1:利用分组后的索引直接筛选

分组后Datetime会成为davg_df2的索引,直接通过索引的月份属性筛选即可:

# 按小时分组求均值(Datetime自动作为索引)
davg_df2 = df.groupby(pd.Grouper(freq='H', key='Datetime')).mean()
# 筛选九月数据
davg_df2 = davg_df2[davg_df2.index.month_name() == 'September']

方法2:分组时保留Datetime为列(使用as_index=False)

如果需要将Datetime保留为DataFrame的列而非索引,在分组时添加as_index=False参数,这样分组键会作为列保留:

# 按小时分组求均值,同时保留Datetime列为普通列
davg_df2 = df.groupby(pd.Grouper(freq='H', key='Datetime'), as_index=False).mean()
# 直接通过Datetime列筛选九月数据
davg_df2 = davg_df2[davg_df2['Datetime'].dt.month_name() == 'September']

方法3:自定义聚合规则保留Datetime列

若需要更灵活的列保留逻辑,可以使用agg()方法指定每个列的聚合方式,显式保留Datetime列(比如取每组的第一个时间戳):

# 按小时分组,自定义聚合规则
davg_df2 = df.groupby(pd.Grouper(freq='H', key='Datetime')).agg(
    InverterVoltage=('InverterVoltage', 'mean'),
    Invertercurrent=('Invertercurrent', 'mean'),
    inverterConsumption=('inverterConsumption', 'mean'),
    Datetime=('Datetime', 'first')  # 保留每组第一个Datetime值
)
# 筛选九月数据
davg_df2 = davg_df2[davg_df2['Datetime'].dt.month_name() == 'September']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:05:23