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

Cumulative week number for subsequent years in data

我想将周数添加到 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 年(因为新数据可以更改年份):

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

我会做:

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 与之前的示例数据方法相同。