【问题标题】:Date formating in PandasPandas 中的日期格式
【发布时间】:2020-06-15 02:00:19
【问题描述】:

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

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'] } )

input_df 是

预期输出是:

我厌倦了以下不起作用的代码:

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

请帮忙..

【问题讨论】:

  • 制作一个函数,尝试解析它。如果失败,什么也不做。如果可行,则根据您的格式约定重新格式化。将其全部返回为字符串。

标签: python python-3.x pandas datetime format


【解决方案1】:

您可以使用error='coerce'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' 列中,['Pre-Nov 2017', 'Nov 17-Nov 18'] 等值正在更改为 NaT。
  • 你忘记fillna了吗?它没有在我的输出中显示NaT
  • 我按原样尝试了您的代码。我的熊猫版本是 '0.23.0' 。会是这个原因吗?
  • @Tad 查看更新后的代码。第二个选项应该可以按预期工作。
猜你喜欢
  • 2020-04-11
  • 2021-11-04
  • 2018-02-20
  • 2019-09-14
  • 2022-01-18
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 2020-04-16
相关资源
最近更新 更多