如何在Python的Pandas中获取年初至今(YTD)数据?
在Pandas中计算年初至今(YTD)销量并绘制柱状图
数据预处理
首先确保日期列是datetime类型,这是后续时间操作的基础:
import pandas as pd import matplotlib.pyplot as plt # 加载本地数据集 df = pd.read_csv('superstore_dataset_final.csv') # 转换日期列为datetime格式 df['date'] = pd.to_datetime(df['date'])
计算单年份YTD销量
如果只需要某一年的年初至今数据(比如最新年份):
# 取数据中的最新年份 target_year = df['date'].dt.year.max() # 筛选该年份的数据 year_data = df[df['date'].dt.year == target_year].copy() # 按日期排序,先聚合每日总销量(避免同一天多条记录重复计算) daily_sales = year_data.groupby(year_data['date'].dt.date)['Sales'].sum().reset_index() # 计算YTD累计销量 daily_sales['ytd_sales'] = daily_sales['Sales'].cumsum()
计算多年份YTD对比数据
如果需要对比不同年份的同期YTD累计销量:
# 提取月日作为统一的日期标识(忽略年份) df['month_day'] = df['date'].dt.strftime('%m-%d') # 按年份和月日分组计算每日销量,再按年份累计得到YTD数据 ytd_by_year = df.groupby([df['date'].dt.year, 'month_day'])['Sales'].sum() ytd_by_year = ytd_by_year.groupby(level=0).cumsum().unstack(level=0)
绘制柱状图
单年份销量与YTD累计图
plt.figure(figsize=(12, 6)) # 每日销量柱状图 plt.bar(daily_sales['date'], daily_sales['Sales'], alpha=0.7, label='每日销量') # YTD累计销量折线图 plt.plot(daily_sales['date'], daily_sales['ytd_sales'], color='#ff4444', linewidth=2, label='YTD累计销量') plt.xlabel('日期') plt.ylabel('销量') plt.title(f'{target_year}年年初至今销量统计') plt.xticks(rotation=45) plt.legend() plt.tight_layout() plt.show()
多年份YTD累计对比柱状图
plt.figure(figsize=(12, 6)) ytd_by_year.plot(kind='bar', ax=plt.gca()) plt.xlabel('月日') plt.ylabel('YTD累计销量') plt.title('各年份年初至今累计销量对比') plt.xticks(rotation=45) plt.tight_layout() plt.show()
你的原代码问题说明
- 分组顺序错误:应该先按年份,再按月日,否则
unstack后的数据结构会混乱,无法正确累计 - 列名错误:你用了
distance.sum(),但该数据集的销量列是Sales - 累计逻辑错误:需要按年份分组后再执行
cumsum(),否则会跨年份累计
内容的提问来源于stack exchange,提问作者John Shecut
相关产品推荐
相关产品推荐

