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

如何用Pandas计算不连续时间序列的日均流量均值(适配闰年)

问题:计算多站点流量的全年日均均值(适配闰年)

我有一个包含多个站点流量时间序列数据的Excel文件,部分年份数据缺失(比如某站点有1983-1985年数据,之后又有1990年数据)。需要对拥有两年及以上数据的站点,生成仅含366行(适配闰年)的Pandas DataFrame,计算所有可用年份中同一天的流量均值(即全年日均流量)。

尝试用df_avg = df.resample('D').mean()没有得到预期结果——因为数据存在日/月/年份缺失,目标是得到按1月1日到12月31日(含2月29日)分组的日均流量。

原始数据示例:

日期流量
01/01/199015
......
31/12/201520

目标输出示例:

日期日均流量
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:10:49