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
假设您有 %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