如何在Pandas中为同赛事分组行应用date_range()更新日期?
处理WTA赛事日期递增的实现方案
核心思路
- 先将日期列转为标准日期格式,同时给轮次定义明确的排序优先级
- 按
['date', 'name']分组,每组内按轮次排序后生成连续日期 - 利用
date_range()根据每组初始日期生成对应天数的日期序列
具体代码步骤
1. 数据读取与预处理
先读取CSV并做基础格式转换,确保轮次排序逻辑正确:
import pandas as pd # 读取赛事CSV数据 df = pd.read_csv('wta_events.csv') # 将原date列转为日期类型,避免字符串处理问题 df['date'] = pd.to_datetime(df['date']) # 定义轮次的先后顺序(从最早轮到决赛) round_order = ['R64', 'R32', 'R16', 'QF', 'SF', 'F'] # 把round列设为分类类型,保证后续排序严格按轮次顺序来 df['round'] = pd.Categorical(df['round'], categories=round_order, ordered=True)
2. 分组生成递增日期
编写分组处理函数,给每个赛事组的轮次匹配连续日期:
def adjust_round_dates(group): # 按轮次顺序排序分组内的数据 sorted_group = group.sort_values('round') # 获取该赛事的初始日期(即原date列的值) start_date = sorted_group['date'].iloc[0] # 生成和轮次数量一致的连续日期,每天递增1天 sorted_group['adjusted_date'] = pd.date_range(start=start_date, periods=len(sorted_group), freq='D') return sorted_group # 应用分组逻辑,group_keys=False避免额外添加分组键列 df_adjusted = df.groupby(['date', 'name'], group_keys=False).apply(adjust_round_dates)
3. date_range()用法解析
这个函数是生成连续日期序列的核心,关键参数说明:
start:序列的起始日期,这里取每组的初始赛事日期periods:要生成的日期数量,等于该赛事组内的轮次总数(每个轮次对应一天)freq='D':日期递增的频率,D代表按天递增,符合需求
结果验证
可以打印部分数据确认效果:
print(df_adjusted[['name', 'round', 'date', 'adjusted_date']].head(10))
输出会看到同赛事下,R64对应原日期,R32对应原日期+1天,直到F轮对应原日期+5天(6个轮次的情况下)。
内容的提问来源于stack exchange,提问作者vmorph
相关产品推荐
相关产品推荐

