我的输入数据框是
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列
如果我使用以下代码,则无法正常工作。我在“目标”列中获得了相同的“源”值。
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
答案 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',则无效的解析将返回输入