在 Pandas 中将“年份”和“一年中的一周”列转换为“日期”

Art*_*sky 4 python datetime pandas

想要的方式

为了将带有年份和一周的两列转换为日期,我希望执行以下操作:

df['formatted_date'] = df.year*100+df.weekofyear
df['date'] = pd.to_datetime(df['formatted_date'], format='%Y%w')
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用,给出了ValueError

ValueError: unconverted data remains: 01
Run Code Online (Sandbox Code Playgroud)

解决方法

我发现的解决方法是将一年中的一周转换为一年中的一天并使用 year-dayofyear%Y%j格式:

df['formatted_date'] = df.year*1000+df.weekofyear*7-6 
df['date'] = pd.to_datetime(df['formatted_date'], format='%Y%j')
Run Code Online (Sandbox Code Playgroud)

第一行变得丑陋,但这工作正常。一年中的第几周在 (00,53) 范围内。任何想法,为什么优雅的方式不起作用?

jez*_*ael 5

你需要结合%w星期几 -解释%W星期:

http://strftime.org/用于%W

以十进制数表示的一年中的周数(星期一为一周的第一天)。新年中第一个星期一之前的所有日子都被视为第 0 周。

而对于%w

工作日为十进制数,其中 0 是星期日,6 是星期六。


df = pd.DataFrame({'year':[2015, 2018],
                   'weekofyear':[10,12]})

dates = df.year*100+df.weekofyear
@adde
df['date'] = pd.to_datetime(dates.astype(str) + '0', format='%Y%W%w')
print (df)

   year  weekofyear  formatted_date       date
0  2015  10          201510         2015-03-15
1  2018  12          201812         2018-03-25
Run Code Online (Sandbox Code Playgroud)

另一种解决方案:

#added 0 only for demontration, you can remove it
df['formatted_date'] = df.year * 1000 + df.weekofyear * 10 + 0
df['date'] = pd.to_datetime(df['formatted_date'], format='%Y%W%w')
print (df)

   year  weekofyear  formatted_date       date
0  2015  10          2015100        2015-03-15
1  2018  12          2018120        2018-03-25
Run Code Online (Sandbox Code Playgroud)