如何在Pandas数据框中重新格式化日期数据

时间:2019-10-22 10:51:33

标签: python pandas datetime

我的输入数据框是

df = pd.DataFrame({'Source':['Pre-Nov 2017', 'Pre-Nov 2017', 'Oct 19', '2019-04-01 00:00:00', '2019-06-01 00:00:00', 'Nov 17-Nov 18', 'Nov 17-Nov 18']})

我将需要以下Target列

enter image description here

如果我使用以下代码,则无法正常工作。我在“目标”列中获得了相同的“源”值。

df['Target'] = pd.to_datetime(df['Source'], format= '%b %Y',errors='ignore')

像熊猫一样正在考虑将'2019-04-01 00:00:00','2019-06-01 00:00:00'等值设为NaN

1 个答案:

答案 0 :(得分:1)

一个想法是,如果日期时间不匹配,请使用errors='coerce'来缺少值,然后通过Series.dt.strftime转换为自定义字符串-NaT也是字符串,因此要替换为原始用途{{3 }}:

df['Target'] = (pd.to_datetime(df['Source'], errors='coerce')
                  .dt.strftime('%b %y')
                  .mask(lambda x: x == 'NaT', df['Source']))
print (df)

                Source         Target
0         Pre-Nov 2017   Pre-Nov 2017
1         Pre-Nov 2017   Pre-Nov 2017
2               Oct 19         Oct 19
3  2019-04-01 00:00:00         Apr 19
4  2019-06-01 00:00:00         Jun 19
5        Nov 17-Nov 18  Nov 17-Nov 18
6        Nov 17-Nov 18  Nov 17-Nov 18

替代方法是使用Series.mask

d = pd.to_datetime(df['Source'], errors='coerce')
df['Target'] = np.where(d.isna(), df['Source'], d.dt.strftime('%b %y'))

编辑:

  

但是为什么没有奏效

     

df ['Target'] = pd.to_datetime(df ['Source'],format ='%b%Y',errors ='ignore')

如果检查numpy.where并使用errors='ignore',如果转换失败,它会返回相同的列值。

  

如果'ignore',则无效的解析将返回输入