Python 熊猫的日期形成

Python 熊猫的日期形成,python,python-3.x,pandas,datetime,format,Python,Python 3.x,Pandas,Datetime,Format,我正在尝试在不更改非日期值的情况下,将带有日期的列格式化为“月-年”格式 input_df = pd.DataFrame({'Period' :['2017-11-01 00:00:00', '2019-02-01 00:00:00', 'Mar 2020', 'Pre-Nov 2017', '2019-10-01 00:00:00' , 'Nov 17-Nov 18'] } ) 输入_df为 预期产出为: 我厌倦了下面的代码,但它不起作用: output_df['Period'] = i

我正在尝试在不更改非日期值的情况下,将带有日期的列格式化为“月-年”格式

input_df = pd.DataFrame({'Period' :['2017-11-01 00:00:00', '2019-02-01 00:00:00', 'Mar 2020', 'Pre-Nov 2017', '2019-10-01 00:00:00' , 'Nov 17-Nov 18'] } )
输入_df为

预期产出为:

我厌倦了下面的代码,但它不起作用:

output_df['Period'] = input_df['Period'].apply(lambda x: x.strftime('%m %Y') if isinstance(x, datetime.date) else x)

请帮助..

您可以使用
error='improve'
fillna
执行以下操作:

input_df['new_period'] = (pd.to_datetime(input_df['Period'], errors='coerce')
       .dt.strftime('%b %Y')
       .fillna(input_df['Period'])
    )
输出:

                Period     new_period
0  2017-11-01 00:00:00       Nov 2017
1  2019-02-01 00:00:00       Feb 2019
2             Mar 2020       Mar 2020
3         Pre-Nov 2017   Pre-Nov 2017
4  2019-10-01 00:00:00       Oct 2019
5        Nov 17-Nov 18  Nov 17-Nov 18
更新:第二个更安全的选项:

s = pd.to_datetime(input_df['Period'], errors='coerce')

input_df['new_period'] = np.where(s.isna(), input_df['Period'], 
                                  s.dt.strftime('%b %Y'))

创建一个函数,尝试解析它。如果失败了,什么也不做。如果有效,则根据格式约定重新格式化。将其全部作为字符串返回。在“new_period”列中,['2017年11月之前','2017年11月17日至11月18日']等值正在更改为NaT。您是否忘记了
fillna
?它没有在我的输出中显示
NaT
。我已经按原样使用了你的代码。我的熊猫版本是“0.23.0”。这就是原因吗?@Tad查看更新的代码。第二个选项应按预期工作。