本文介绍如何基于每行记录的日期与当前日期之间的完整周数,对 dataframe 行进行智能重复,并为每一重复行生成对应的 iso 周编号(含跨年处理),避免手动循环和索引错位问题。
在数据分析中,常需将单条时间记录“展开”为按周粒度的多行数据——例如,为每个 ID 生成从其原始日期起、持续至当前周的全部周序列。关键挑战在于:既要准确计算周数差(支持跨年),又要为每行分配正确的 ISO 年份与周号(isocalendar().year 和 .week),而非简单递增数字。
原方法使用 for 循环修改 loc 并依赖 ffill(),存在两大缺陷:
- ✅ 错误复用全局索引(如 final.loc[i, ‘WEEK’] 覆盖非目标行);
- ❌ 忽略 ISO 周的语义(如 2023-12-24 属于 ISO 第51周,但下一周是2023年第52周或2024年第1周,不可线性+1)。
正确解法应以时间为本体:对每行原始日期,逐周递增7天,再统一提取其 ISO 周信息。以下是推荐实现: