数据中后续年份的累计周数
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']})
然后我从数据中提取了week
和year
。
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
与之前的示例数据方法相同。
我想将周数添加到 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']})
然后我从数据中提取了week
和year
。
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
与之前的示例数据方法相同。