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



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

我想看看是否有更好的方法来处理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

这是熊猫会做的,我相信这是因为熊猫希望第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

最新更新