如何用Pandas从日期列生成以最早日期为起点的连续周数
解决Pandas中生成自定义连续周数列的问题
问题描述
现有一个包含2019年起日期列的大型Pandas数据集,需实现以下需求:
- 先将日期列按从早到晚排序
- 以数据集中最早的有效采集日期为起点,每7天划分为一周,生成连续递增的周数列(如第1周、第2周……第N周),新增为单独列
- 此前使用
pd.to_datetime(df['date'], errors='coerce').dt.week生成的周数存在重复,无法满足连续递增的要求
解决方案
核心思路是:以数据集的最早有效日期为基准,计算每个日期与基准日的天数差,通过整数除法得到对应的连续周数(起始周记为第1周)。具体步骤如下:
步骤1:日期列清洗与转换
先将日期列转换为datetime类型,同时处理缺失值(文本NaN会被转换为时间类型的缺失值NaT):
import pandas as pd # 原始数据 data = {'date': ['2019-09-10', 'NaN', '2019-10-07', '2019-11-04', '2019-11-28', '2019-12-02', '2020-01-24', '2020-01-29', '2020-02-05', '2020-02-12', '2020-02-14', '2020-02-24', '2020-03-11', '2020-03-16', '2020-03-17', '2020-03-18', '2021-09-14', '2021-09-30', '2021-10-07', '2021-10-08', '2021-10-12', '2021-10-14', '2021-10-15', '2021-10-19', '2021-10-21', '2021-10-26', '2021-10-28', '2021-10-29', '2021-11-02', '2021-11-15', '2021-11-16', '2021-12-01', '2021-12-07', '2021-12-09', '2021-12-10', '2021-12-14', '2021-12-15', '2022-01-13', '2022-01-14', '2022-01-21', '2022-01-24', '2022-01-25', '2022-01-27', '2022-01-31', '2022-02-01', '2022-02-10', '2022-02-11', '2022-02-16', '2022-02-24']} df = pd.DataFrame(data) # 转换日期类型,处理缺失值 df['date'] = pd.to_datetime(df['date'], errors='coerce')
步骤2:确定周数计算的起始基准
过滤掉无效日期后,取最早的有效日期作为周数计算的起点:
# 获取有效日期的最小值作为起始基准 start_date = df['date'].dropna().min()
步骤3:生成连续周数列
计算每个日期与起始日的天数差,通过整数除法得到对应的周数(加1是因为起始周记为第1周):
# 计算每个日期对应的连续周数,无效日期设为None df['weeks'] = df['date'].apply( lambda x: (x - start_date).days // 7 + 1 if pd.notna(x) else None )
步骤4:按日期排序
最后将数据集按日期从早到晚排序,完成需求:
df = df.sort_values('date').reset_index(drop=True)
效果验证
运行上述代码后,df['weeks']列会生成完全连续递增的周数,例如:
- 起始日2019-09-10对应第1周
- 2019-10-07距离起始日27天,
27//7 +1 =4,对应第4周 - 2022-02-24距离起始日907天,
907//7 +1=130,对应第130周
完全避免了dt.week带来的跨年度周数重复问题,符合需求。
内容的提问来源于stack exchange,提问作者LivingstoneM
相关产品推荐
相关产品推荐

