如何用Pandas为跨年度起止日期生成唯一时间步周编号
自定义连续周编号生成方案
需求说明
现有包含start_date、end_date和country列的Pandas DataFrame,数据覆盖多个年份。需要新增一列标记每行数据的时间步周编号:将数据中首次出现的周标记为1,后续周依次递增,不受年度周数规则及country列重复的影响。isocalendar().week仅能获取对应年份的周数,无法满足该需求。
解决方案
核心思路是基于start_date的唯一值按出现顺序分配连续编号,具体实现如下:
import pandas as pd import numpy as np # 生成示例数据 dates = pd.date_range(start='2021-11-11', periods=20, freq='W') df = pd.DataFrame({ 'start_date': np.repeat(dates, 5), 'end_date': np.repeat(dates + pd.DateOffset(days=6), 5), 'country': ['USA', 'Canada', 'UK', 'Australia', 'Russia'] * 20 }) df = df.sort_values("start_date") # 新增连续周编号列 df['week_step'] = pd.factorize(df['start_date'])[0] + 1 # 查看结果 print(df.head(10))
代码解释
pd.factorize(df['start_date'])会将start_date中的唯一值按首次出现顺序分配从0开始的整数标识,加1后得到从1起始的连续周编号。- 由于已提前按
start_date排序,首次出现的周会被标记为1,后续周依次递增,完全不受年度周数限制和country重复的影响。
未排序数据的兼容处理
如果DataFrame未提前按start_date排序,可先对start_date排序后再生成编号:
# 先排序,再生成编号 df = df.sort_values('start_date') df['week_step'] = pd.factorize(df['start_date'])[0] + 1
内容的提问来源于stack exchange,提问作者sergey_208
相关产品推荐
相关产品推荐

