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列均未显示。
问题原因
resample会将DATE_TIME设为临时索引,若在apply外部才执行reset_index(),层级索引的处理会导致DATE_TIME列显示异常。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
相关产品推荐
相关产品推荐

