Pandas to_datetime %Y%U 到 %Y%U%w 53 周年

Pandas to_datetime %Y%U to %Y%U%w with 53 week years

假设您有 %Y%U 格式的日期,例如 202101(2021 年第 1 周)并且您想使用 pd.to_datetime 将其转换为常规日期,例如 2021-01-04

我想看看是否有更好的方法来处理年 w/53 周。考虑以下因素:

from datetime import date
import pandas as pd

df = pd.DataFrame({'week':['202053','202101']})

这是我想要的

print(date.fromisocalendar(2020,53,1), date.fromisocalendar(2021,1,1))

2020-12-28 2021-01-04

这就是 pandas 要做的,我认为这是由于 pandas 希望将第 53 周视为明年的第 0 周

print(pd.to_datetime(df.week.astype(str)+'1', format='%Y%W%w').tolist())

[Timestamp('2021-01-04 00:00:00'), Timestamp('2021-01-04 00:00:00')]

所以我能做到

df['week'] = np.where(df['week'].str.endswith('53'), (df['week'].astype(int)+47).astype(str),df['week'])
print(pd.to_datetime(df.week.astype(str)+'1', format='%Y%W%w').tolist())

[Timestamp('2020-12-28 00:00:00'), Timestamp('2021-01-04 00:00:00')]

所以我可以在任何以 53 结尾的日期上加上 47 周,我得到了我期望的结果。这感觉像是一种非常迂回的方式来实现这一目标。

有没有更标准的方法来处理这个问题?

既然你用的是date.fromisocalendar(2020,53,1),那么你可以试试

df['week_'] = pd.to_datetime(df['week']+'1', format='%G%V%w')

哪里

  • %G:ISO 8601 年,世纪代表包含 ISO 周 (%V) 大部分的年份。
  • %V:ISO 8601 周为十进制数,星期一为一周的第一天。第 01 周是包含 1 月 4 日的那一周。
  • %w:十进制表示的星期几,其中 0 是星期日,6 是星期六。
print(df)

     week      week_
0  202053 2020-12-28
1  202101 2021-01-04