Pandas Resample聚合时未返回指定on列的问题
解决Pandas新版本resample后日期列变索引的问题
问题原因
Pandas 2.0+版本对resample的行为做了调整:当指定on参数时,该时间列会自动成为结果的DatetimeIndex,不再作为普通列保留,所以你没法用d['Date In']直接访问。
单统计流入量的解决办法
如果只需要统计每月流入量,有两种简单方式:
方法1:把索引转回普通列
用reset_index()将DatetimeIndex转成普通列,同时用size()直接计数每月的流入记录数:
inflow = df.resample('M', on='Date In').size().reset_index(name='流入量') # 此时Date In是普通列,可正常用inflow['Date In']调用
方法2:指定统计目标列
如果习惯用count(),可以只针对Date In列统计,避免结果混入其他列:
inflow = df.resample('M', on='Date In')['Date In'].count().reset_index(name='流入量')
同时统计流入+流出量
要同时得到每月的流入、流出数据,需要分别对两个日期列做resample,再合并结果:
import pandas as pd # 统计流入量:按Date In分组计数 inflow = df.resample('M', on='Date In').size().reset_index(name='流入量') # 统计流出量:按Date Out分组计数 outflow = df.resample('M', on='Date Out').size().reset_index(name='流出量') # 合并数据,按月份对齐,缺失的月份补0 monthly_stats = pd.merge(inflow, outflow, left_on='Date In', right_on='Date Out', how='outer').fillna(0) # 统一月份列,清理冗余 monthly_stats['月份'] = monthly_stats['Date In'].combine_first(monthly_stats['Date Out']) monthly_stats = monthly_stats[['月份', '流入量', '流出量']]
额外提示
size()比count()更适合做行数统计:count()会忽略空值,size()直接统计分组内总记录数;- 如果不想转索引,也可以直接通过
d.index访问日期,比如d.index.strftime('%Y-%m')可以格式化成年月字符串;
内容的提问来源于stack exchange,提问作者eatkimchi
相关产品推荐
相关产品推荐

