新手求助:如何用Pandas基于多年度CSV按周生成透视表?
如何用Pandas按周生成透视表并自动筛选时间范围?
嘿,我来帮你搞定这个按周生成透视表的问题!你现在手动指定固定日期范围的方式,在处理多年数据时确实太繁琐了,咱们可以利用Pandas自带的时间序列工具来高效实现按周分组和筛选,不用每次手动改日期。
第一步:先统一处理日期列
首先建议你一次性把fecha列转换成datetime类型,避免重复转换:
# 转换日期列,加上errors='coerce'可以处理无效日期格式 df['fecha'] = pd.to_datetime(df['fecha'], errors='coerce')
方案一:生成包含所有周汇总的透视表
如果想要一个整合了所有周数据的透视表(列是每周的周期),可以用pd.Grouper来按周分组,替代原来的单个日期列:
# 先筛选你需要的时间范围(比如2017-03-01到2018-01-15) date_mask = (df['fecha'] >= '2017-03-01') & (df['fecha'] <= '2018-01-15') filtered_df = df[date_mask] # 生成按周聚合的透视表 weekly_pivot = pd.pivot_table( filtered_df, columns=pd.Grouper(key='fecha', freq='W'), # freq='W'默认周日为周结束,可用'W-MON'设周一结束 index=['org', 'tipo', 'estado'], values=['destination', 'time_total', 'time_avg'], aggfunc={ 'destination': len, 'time_total': total_secs_inTimeSerie, 'time_avg': mean_secs_inTimeSerie }, fill_value="", margins=True ) # 保存为HTML文件 weekly_pivot.to_html(report_name)
方案二:为每一周单独生成透视表
如果需要给每个周单独生成一份报表(比如每周一个HTML文件),可以先按周拆分数据,再循环处理:
# 转换日期列 df['fecha'] = pd.to_datetime(df['fecha'], errors='coerce') # 筛选目标时间范围 date_mask = (df['fecha'] >= '2017-03-01') & (df['fecha'] <= '2018-01-15') filtered_df = df[date_mask] # 按周分组 weekly_groups = filtered_df.groupby(pd.Grouper(key='fecha', freq='W')) # 遍历每个周生成报表 for week_end_date, week_data in weekly_groups: # 跳过没有数据的周 if week_data.empty: continue # 生成该周的透视表 week_pivot = pd.pivot_table( week_data, columns='fecha', # 保留该周的单日数据,也可以换成周标识 index=['org', 'tipo', 'estado'], values=['destination', 'time_total', 'time_avg'], aggfunc={ 'destination': len, 'time_total': total_secs_inTimeSerie, 'time_avg': mean_secs_inTimeSerie }, fill_value="", margins=True ) # 生成带周日期的文件名 report_filename = f"weekly_report_{week_end_date.strftime('%Y-%m-%d')}.html" # 保存文件 week_pivot.to_html(report_filename)
小提示
- 调整周的起始/结束:
freq参数可以自定义周的计算方式,比如'W-MON'表示每周一作为周结束,'W-FRI'是周五结束,按需选择即可。 - 自定义聚合函数:确保你的
total_secs_inTimeSerie和mean_secs_inTimeSerie函数能正确接收Pandas Series作为输入,避免报错。
内容的提问来源于stack exchange,提问作者Colegatron
相关产品推荐
相关产品推荐

