如何基于日期间隔按周数重复数据行-Python教程

本文介绍如何根据每行日期与当前日期之间的完整周数,动态重复dataframe中的行,并为每条重复记录生成对应的iso周数(week)和年份(year),实现精准的时间维度展开。

在数据分析中,常需将单条时间记录“展开”为多个时间切片(如按周、月),尤其适用于周报聚合、滚动预测或时间序列对齐场景。本文解决的核心问题是:对每一行的 DATE,计算其到当前日期(pd.Timestamp(‘now’))之间包含多少个完整自然周(含起始周),然后将该行重复对应次数,并为每次重复分配递增的ISO周编号(含跨年处理)。

关键难点在于:

  • 周数计算需基于 ISO 周历(isocalendar()),而非简单天数除以7;
  • 重复后每行的 WEEK 应从原始日期所在周开始,逐周递增(如2023-12-24属2023年第51周,则后续为52、1、2…);
  • 必须正确处理跨年(如2023-W52 → 2024-W01);
  • 避免循环操作,保证向量化性能。

✅ 推荐方案(高效、健壮、一行逻辑清晰):

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'ID': ['ID001', 'ID002', 'ID003'],
    'DATE': ['24/12/2023', '01/02/2024', '12/02/2024']
})
df['DATE'] = pd.to_datetime(df['DATE'], dayfirst=True)

# 步骤1:计算每个日期到当前日期的完整ISO周数(含起始周)
# 使用 Period 进行周对齐,避免日历偏差
current_week = pd.Timestamp('now').to_period('W')
date_weeks = df['DATE'].dt.to_period('W')
n_weeks = (current_week - date_weeks).apply(lambda p: p.n)  # 得到整数周差

# 步骤2:按周数+1重复行(+1 因为包含起始周本身)
# 使用 loc + index.repeat 实现向量化重复
repeated = df.loc[df.index.repeat(n_weeks + 1)].copy().reset_index(drop=True)

# 步骤3:为每组重复行生成递增周序列(从原始日期开始,每周+7天)
# groupby(level=0) 不适用(已重置索引),改用 cumcount() 配合原始分组标识
# 更稳健做法:先恢复分组标识,再计算偏移
group_ids = repeated.index.to_series().groupby(repeated.index // 1).ngroup()  # 实际可直接用 cumcount 分组
# 简洁写法(推荐):
offset_days = repeated.groupby(repeated.index // 1).cumcount() * 7
repeated['WEEK_DATE'] = df.loc[repeated.index // 1, 'DATE'].values + pd.to_timedelta(offset_days, unit='D')

# 步骤4:提取 ISO 年份与周数
repeated['YEAR'] = repeated['WEEK_DATE'].dt.isocalendar().year
repeated['WEEK'] = repeated['WEEK_DATE'].dt.isocalendar().week

# 最终结果(保留原始列 + YEAR/WEEK)
result = repeated[['ID', 'DATE', 'YEAR', 'WEEK']].copy()
print(result)

? 输出说明(以运行时刻为2024-02-25左右为例):

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何基于日期间隔按周数重复数据行-Python教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4027781+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4027781+
  • 本周更新: 0+
  • 最后更新: 2026-03-16