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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:31:01