如何用Pandas计算不连续时间序列的日均流量均值(适配闰年)
问题:计算多站点流量的全年日均均值(适配闰年)
我有一个包含多个站点流量时间序列数据的Excel文件,部分年份数据缺失(比如某站点有1983-1985年数据,之后又有1990年数据)。需要对拥有两年及以上数据的站点,生成仅含366行(适配闰年)的Pandas DataFrame,计算所有可用年份中同一天的流量均值(即全年日均流量)。
尝试用df_avg = df.resample('D').mean()没有得到预期结果——因为数据存在日/月/年份缺失,目标是得到按1月1日到12月31日(含2月29日)分组的日均流量。
原始数据示例:
| 日期 | 流量 |
|---|---|
| 01/01/1990 | 15 |
| ... | ... |
| 31/12/2015 | 20 |
目标输出示例:
| 日期 | 日均流量 |
|---|---|
| 1月1日 | 16 |
| ... | ... |
| 12月31日 | ... |
| 2月29日 | ... |
解决方案
步骤1:转换日期格式为datetime
首先确保日期列是Pandas可识别的datetime类型,注意原始日期是日/月/年格式,需指定dayfirst=True:
import pandas as pd # 读取Excel数据 df = pd.read_excel('你的流量数据.xlsx') # 转换日期列 df['日期'] = pd.to_datetime(df['日期'], dayfirst=True)
步骤2:提取月日作为分组标识
生成每个日期对应的月-日字符串,这样能把不同年份的同一天归为一组,同时适配闰年的2月29日:
df['月日'] = df['日期'].dt.strftime('%m-%d')
步骤3:按“月日”分组计算均值
对每个月日分组计算流量平均值,直接得到366行的结果:
df_daily_avg = df.groupby('月日')['流量'].mean().reset_index()
步骤4:美化日期显示(可选)
如果需要将01-01转换为“1月1日”的格式,可执行以下代码:
# 将月日字符串转换为中文日期格式 df_daily_avg['日期'] = df_daily_avg['月日'].apply(lambda x: f"{int(x.split('-')[0])}月{int(x.split('-')[1])}日") # 调整列顺序并删除临时列 df_daily_avg = df_daily_avg.drop('月日', axis=1)[['日期', '日均流量']]
步骤5:筛选多站点中符合条件的站点(如果是多站点数据)
如果数据包含多个站点,需先筛选出有两年及以上数据的站点,再计算日均:
# 提取每条数据的年份 df['年份'] = df['日期'].dt.year # 统计每个站点的不同年份数量 site_year_count = df.groupby('站点名称')['年份'].nunique() # 筛选出年份数≥2的站点 valid_sites = site_year_count[site_year_count >= 2].index # 过滤数据后按站点+月日计算均值 valid_df = df[df['站点名称'].isin(valid_sites)] final_result = valid_df.groupby(['站点名称', '月日'])['流量'].mean().reset_index() # 同样可按步骤4美化日期列
内容的提问来源于stack exchange,提问作者Fusi
相关产品推荐
相关产品推荐

