数据中后续年份的累积周数

问题描述

我想将星期几添加到Pandas DataFrame中。但这应该是累积的周数,在明年的1-52之后以53-104继续(而不是简单地从1-52重新开始)。 SO post正在处理类似的问题,但由于它提供的是排名而不是周数,因此没有给出理想的结果。

作为示例,我使用以下数据集。

import pandas as pd
df = pd.DataFrame({'Date':['2018-01-03','2018-01-10','2018-12-31','2019-01-06','2019-01-02','2019-03-15','2019-12-31','2020-01-02']})

然后我从数据中提取weekyear

df['Date'] = pd.to_datetime(df['Date'])
df['Week'] = df['Date'].dt.isocalendar().week
df['Year'] = df['Date'].dt.isocalendar().year

并找到以下可行的解决方案。

df['Weeknr'] = df['Week'] + df['Year'].map({2018:0,2019:52,2020:104})

但是我很好奇是否存在更好的选择。无需在代码中手动输入2018、2019和2020年(因为新数据可能会更改年份):

所以问题是,是否有任何函数或任何其他方式可以计算累计周数?

enter image description here

解决方法

我会做的:

df['weeknr'] = df['Week'] + (df['Year'] - df['Year'].min())*52

输出:

        Date  Week  Year  weeknr
0 2018-01-03     1  2018       1
1 2018-01-10     2  2018       2
2 2018-12-31     1  2019      53
3 2019-01-06     1  2019      53
4 2019-01-02     1  2019      53
5 2019-03-15    11  2019      63
6 2019-12-31     1  2020     105
7 2020-01-02     1  2020     105

更新:关于绝对周数而不是等腰历的想法:

min_year = pd.to_datetime(f"{df['Date'].dt.year.min()}-01")
df['weeknr'] = (df['Date'] - min_year) // pd.to_timedelta('7D') + 1

这将为样本数据提供与先前方法相同的weeknr