pandas如何按日期交叉统计或计数dataframe行,按年季度月统计新建关闭量
实现步骤
首先你需要先把日期列转为pandas的datetime格式,再拆分创建、关闭两类事件分别统计后合并,具体代码如下:
1. 日期格式转换
import pandas as pd # 原日期为日-月-年格式,指定format转换更稳妥,避免解析出错 dfImport['date_created'] = pd.to_datetime(dfImport['date_created'], format='%d-%m-%Y') dfImport['date_closed'] = pd.to_datetime(dfImport['date_closed'], format='%d-%m-%Y')
2. 分别统计新建、关闭数量
# 统计各时间维度的新建数量 create_df = dfImport[['id', 'date_created']].copy() create_df['year'] = create_df['date_created'].dt.year create_df['qrt'] = create_df['date_created'].dt.quarter create_df['month'] = create_df['date_created'].dt.month_name() create_stat = create_df.groupby(['year', 'qrt', 'month'], as_index=False)['id'].count().rename(columns={'id':'number_created'}) # 统计各时间维度的关闭数量,先过滤掉未关闭的空值 close_df = dfImport[['id', 'date_closed']].dropna(subset=['date_closed']).copy() close_df['year'] = close_df['date_closed'].dt.year close_df['qrt'] = close_df['date_closed'].dt.quarter close_df['month'] = close_df['date_closed'].dt.month_name() close_stat = close_df.groupby(['year', 'qrt', 'month'], as_index=False)['id'].count().rename(columns={'id':'number_closed'})
3. 合并统计结果得到最终表
# 外连接合并两类统计结果,缺失值补0 dfInOut = pd.merge(create_stat, close_stat, on=['year', 'qrt', 'month'], how='outer').fillna(0) # 计数列转整数,按时间顺序排序 dfInOut[['number_created', 'number_closed']] = dfInOut[['number_created', 'number_closed']].astype(int) dfInOut['month_sort'] = pd.to_datetime(dfInOut['month'], format='%B').dt.month dfInOut = dfInOut.sort_values(['year', 'qrt', 'month_sort']).drop(columns=['month_sort']).reset_index(drop=True) # 实现相同年份、季度只显示第一行的效果,和你给出的示例格式一致 dfInOut.loc[dfInOut.duplicated(subset=['year', 'qrt']), ['year', 'qrt']] = '' dfInOut = dfInOut.rename(columns={'year':'Year', 'qrt':'Qrt'})
运行完以上代码后输出的dfInOut就完全符合你的预期要求。
内容的提问来源于stack exchange,提问作者Arne_22
相关产品推荐
相关产品推荐

