如何按月份分组取每月前3个日期均值并合并周度与月度DataFrame?
解决周度DataFrame与月度DataFrame合并并计算每月前三个日期均值的问题
我来帮你一步步实现这个需求,核心思路是先处理周度数据计算出每月前三个日期的均值,再和月度DataFrame合并,下面是具体的代码和步骤:
1. 准备数据并处理日期格式
首先我们需要把周度DataFrame的Date列转为datetime类型,这样才能方便提取月份信息,避免字符串处理的麻烦:
import pandas as pd # 你的周度数据 weekly_df = pd.DataFrame({ 'Date': ['2020-01-01', '2020-01-08', '2020-01-16', '2020-01-24', '2020-02-01', '2020-02-08', '2020-02-16', '2020-02-24'], 'Value': [2, 2, 2, 1, 1, 1, 1, 1] }) # 转换日期格式 weekly_df['Date'] = pd.to_datetime(weekly_df['Date'])
2. 计算每月前三个日期的均值
我们先给周度数据添加一个Month列(月度周期类型),然后按月份分组,每个组内先按日期排序(确保取到的是每月最早的三个日期),再取前3行计算Value的均值:
# 添加月度分组列,用period类型保证和后续月度数据的匹配 weekly_df['Month'] = weekly_df['Date'].dt.to_period('M') # 分组计算每月前3个日期的均值 monthly_first3_avg = weekly_df.groupby('Month').apply( lambda group: group.sort_values('Date').head(3)['Value'].mean() ).reset_index(name='Weekly_First3_Avg')
这里有个细节:即使你的原始数据日期已经是升序,我还是加上了sort_values('Date'),这样能避免数据乱序导致取错日期的问题,让代码更健壮。如果某个月份的日期不足3个,head(3)会自动取所有现有行计算均值,逻辑也符合需求。
3. 合并月度DataFrame
假设你的月度DataFrame是类似下面的结构,我们需要把它的Month列也转为period类型,保证和周度处理后的列类型一致,然后用merge完成合并:
# 示例月度DataFrame(替换成你实际的月度数据) monthly_df = pd.DataFrame({ 'Month': ['2020-01', '2020-02'], 'Monthly_Metric': [50, 60] }) # 转换月度列的类型,和周度数据匹配 monthly_df['Month'] = pd.to_period('M') # 合并两个DataFrame,这里用left join保证月度数据的所有行都保留 merged_df = pd.merge(monthly_df, monthly_first3_avg, on='Month', how='left')
运行后merged_df就是你需要的合并结果,包含月度数据和对应月份周度前三个日期的均值。
内容的提问来源于stack exchange,提问作者Alissa L.
相关产品推荐
相关产品推荐

