DataFrame日期格式转换及年度/季度统计图表绘制技术咨询
问题解决方案
样例DataFrame初始化
首先还原样例数据:
import pandas as pd data = { 'A': ['FP002', 'FP003', 'FP005', 'FP005'], 'B': ['12', '7610', '12,', '1250'], 'C': ['apr-1-2015', 'may-8-2015', 'jul-2-2019', 'jun-1-2018'], 'D': [113, 99, 102, 94], 'E': [406, 552, 131, 739], 'F': [519, 651, 1416, 833], 'G': [85, 49, 24, 122], 'H': [82, 64, 89, 215], 'I': ['FP001', 'FP002', 'FP003', 'FP004'], 'J': ['mar-2016', 'oct-2017', 'may-2021', 'dec-2018'] } df = pd.DataFrame(data)
需求1:日期格式转换生成新DataFrame
1.1 保留“月-年”格式的DataFrame
先将C列转为datetime类型,再提取%b-%Y格式生成新列:
# 转换C列为datetime,指定解析格式匹配原始数据 df['C_dt'] = pd.to_datetime(df['C'], format='%b-%d-%Y') # 生成包含月-年格式列的新DataFrame,清理临时列 df_month_year = df.assign(C_month_year=df['C_dt'].dt.strftime('%b-%Y')).drop(columns='C_dt')
生成的df_month_year中,C_month_year列即为apr-2015这类格式。
1.2 仅保留年份的DataFrame
基于转换后的datetime列提取年份数值:
# 生成仅含年份列的新DataFrame df_year_only = df.assign(C_year=df['C_dt'].dt.year).drop(columns='C_dt')
df_year_only中的C_year列是2015、2019这类纯年份数值。
需求2:日期维度统计与可视化
首先统一处理C列和J列的日期:J列无日信息,转换时默认用当月1号。
# 重新处理C列日期(若之前已处理可跳过) df['C_dt'] = pd.to_datetime(df['C'], format='%b-%d-%Y') # 处理J列日期,匹配无日的格式 df['J_dt'] = pd.to_datetime(df['J'], format='%b-%Y')
2.1 C列年度统计与绘图
按C列日期的年份分组,统计A列条目数并绘图:
import matplotlib.pyplot as plt # 按年份分组统计A列条目数 c_year_stats = df.groupby(df['C_dt'].dt.year)['A'].count().reset_index(name='条目数') # 绘制柱状图 plt.figure(figsize=(8, 4)) plt.bar(c_year_stats['C_dt'], c_year_stats['条目数']) plt.xlabel('年份') plt.ylabel('A列条目数量') plt.title('C列各年度A条目统计') plt.tight_layout() plt.show()
2.2 C列季度统计与绘图
提取季度+年份标识,分组统计后绘图:
# 生成季度-年份格式的标识(如Q2-2015) df['C_季度'] = df['C_dt'].dt.to_period('Q').astype(str) # 分组统计 c_quarter_stats = df.groupby('C_季度')['A'].count().reset_index(name='条目数') # 绘图 plt.figure(figsize=(8, 4)) plt.bar(c_quarter_stats['C_季度'], c_quarter_stats['条目数']) plt.xlabel('季度-年份') plt.ylabel('A列条目数量') plt.title('C列各季度A条目统计') plt.xticks(rotation=45) plt.tight_layout() plt.show()
2.3 J列年度统计与绘图
复用C列的统计逻辑,基于J列日期的年份分组:
# 按J列年份分组统计 j_year_stats = df.groupby(df['J_dt'].dt.year)['A'].count().reset_index(name='条目数') # 绘图 plt.figure(figsize=(8, 4)) plt.bar(j_year_stats['J_dt'], j_year_stats['条目数']) plt.xlabel('年份') plt.ylabel('A列条目数量') plt.title('J列各年度A条目统计') plt.tight_layout() plt.show()
2.4 J列季度统计与绘图
# 生成J列的季度-年份标识 df['J_季度'] = df['J_dt'].dt.to_period('Q').astype(str) # 分组统计 j_quarter_stats = df.groupby('J_季度')['A'].count().reset_index(name='条目数') # 绘图 plt.figure(figsize=(8, 4)) plt.bar(j_quarter_stats['J_季度'], j_quarter_stats['条目数']) plt.xlabel('季度-年份') plt.ylabel('A列条目数量') plt.title('J列各季度A条目统计') plt.xticks(rotation=45) plt.tight_layout() plt.show()
关于原代码的问题说明
df.groupby('A')['C'].sum()无法得到目标结果的原因:该代码是按A列分组对C列求和,但C列是日期字符串,求和操作无意义。我们需要的是按日期维度(年/季度)分组,统计每个维度下A列的条目数量,因此必须以日期列的年/季度作为分组键,再对A列执行count()统计。
内容的提问来源于stack exchange,提问作者kiwi_kimchi
相关产品推荐
相关产品推荐

