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

Pandas中使用groupby与resample时如何显示datetime对象?

问题描述

生成包含DATE_TIME、TIME及多数值列的DataFrame后,使用以下代码按CYCLE_PART分组并以不同频率重采样:

freq = {'Night': '30min', 'Morning': '15min'}
out = (df.groupby('CYCLE_PART')
         .apply(lambda g: g.resample(freq[g.name], on='DATE_TIME').mean())
         .reset_index()
       )

但输出结果中DATE_TIME和TIME列均未显示。

问题原因
  1. resample会将DATE_TIME设为临时索引,若在apply外部才执行reset_index(),层级索引的处理会导致DATE_TIME列显示异常。
  2. mean()方法会自动忽略非数值类型列,原TIME是字符串类型,因此被直接丢弃。
解决方案

通过指定聚合规则保留必要列,并调整索引重置的时机,同时重新生成TIME列(原字符串TIME列无聚合意义):

freq = {'Night': '30min', 'Morning': '15min'}

# 分组后按对应频率重采样,指定各列聚合方式
out = (df.groupby('CYCLE_PART', group_keys=False)
         .apply(lambda g: g.resample(freq[g.name], on='DATE_TIME')
                           .agg({
                               # 数值列用均值聚合
                               'ID': 'mean',
                               'VALUE1': 'mean',
                               'VALUE2': 'mean',
                               'VALUE3': 'mean',
                               'VALUE4': 'mean',
                               'MODEL': 'mean',
                               'SOLD': 'mean',
                               'INSPECTION': 'mean',
                               # 非数值列用众数保留(保证MODE列不丢失)
                               'MODE': lambda x: x.mode()[0]
                           })
                           # 在apply内部重置索引,将DATE_TIME从索引转为普通列
                           .reset_index()
               )
         # 清理外层索引
         .reset_index(drop=True)
       )

# 从保留的DATE_TIME中重新生成TIME列(比原列更准确)
out['TIME'] = out['DATE_TIME'].dt.time.astype('str')

关键说明

  • 使用agg()显式定义每列的聚合逻辑,避免自动丢弃非数值列。
  • 在apply内部对重采样结果执行reset_index(),确保DATE_TIME作为普通列被保留。
  • 原TIME列是字符串类型,重采样时无法计算有意义的聚合值,因此从DATE_TIME中重新提取更合理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:36:25