在熊猫中将“年”和“年中的星期”列转换为“日期”

时间:2019-03-18 13:23:36

标签: python pandas datetime

所需方式

为了将年份和年份的两列转换为日期,我希望这样做:

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

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

ValueError: unconverted data remains: 01

解决方法

我发现解决方法是将一年中的某周转换为一年中的某天,并使用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')

第一行变得丑陋,但这很好用。一年中的星期在(00,53)范围内。 有什么想法,为什么优雅的方式行不通?

1 个答案:

答案 0 :(得分:3)

您需要将%w用于一周中的某天-explanation%W用于一周:

http://strftime.org/ for %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

另一种解决方案:

#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