如何在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
相关产品推荐
相关产品推荐

