【问题标题】:Parse multiple date formats into a single format将多种日期格式解析为一种格式
【发布时间】:2020-07-04 23:38:19
【问题描述】:

我有一个名为已发布(日期)的专栏。如您所见,它有多种日期格式和 nan 值。我想跳过 nan 值,将所有其他格式转换为 %Y-%-%d,并忽略具有唯一年份的格式。

我试过 df['publish_time']=pd.to_datetime(df['publish_time']) 还有类似的东西:

fmt=['%Y-%m-%d', '%d-%m-%Y', '%d/%m/%Y',
              '%Y-%d-%m', '%Y-%d-%b', '%d-%b-%Y', '%d/%b/%Y','Year: %d; month','month: 
               %d;Year','%Y','%b %d %Y','%b %Y %d']

但我无法解决它。有什么建议?谢谢!

这是那一栏:

published

2014 Jul 22
2003 Aug
2019 Nov 26
2012-12-07
2020 Jan 21
2015-01-01
2010-11-30
2007-05-10
2020
2012-02-29
2016 Apr 19
2006-12-31
2013 Jun 27
2019 Jun 19
2015 Jun 12
2006 Jun-Dec
2006-07-31
nan
2017-04-15
2016 May 22
2020 Feb
2017 May 6
2020 Mar 11
2013-04-30
2020-03-07
nan
2018

【问题讨论】:

  • 理想情况下,应该在达到这一点之前解决这个问题;当你最终得到这种脏数据时,回过头来弄清楚如何在摄取时清理它通常是正确的方法(如果这一切都来自单一来源,则丢弃它们,如果它们是向您收费,是时候要求您退款了)。此时,您应该预期 y/d/m、y/m/d 和可能的其他格式的转换结果不正确,并且您有太多毫无意义的数据……真的,回顾一下链并尝试修复出现的问题。

标签: python pandas date


【解决方案1】:

首先在fmt 列表中添加了 2 种新格式:

fmt=['%Y-%m-%d', '%d-%m-%Y', '%d/%m/%Y',
     '%Y-%d-%m', '%Y-%d-%b', '%d-%b-%Y', '%d/%b/%Y','Year: %d; month',
     'month: %d;Year','%Y','%b %d %Y','%b %Y %d',
     '%Y %b %d', '%Y %b']

然后在列表理解中将列转换为日期时间,参数errors='coerce' 用于将不匹配的值转换为缺失值。最后通过concat一起加入。

最后因为每行可能有多个值,因为 dd/mm/YYYYmm/dd/YYYY 格式(不确定是否是一天中的月份)用于回填选择第一列。这意味着哪种格式在列表中排在第一位,它以高优先级被选中。

dfs = [pd.to_datetime(df['publish_time'], format=f, errors='coerce') for f in fmt]
df['publish_time1']= pd.concat(dfs, axis=1).bfill(axis=1).iloc[:, 0]

print (df)
    publish_time publish_time1
0    2014 Jul 22    2014-07-22
1       2003 Aug    2003-08-01
2    2019 Nov 26    2019-11-26
3     2012-12-07    2012-12-07
4    2020 Jan 21    2020-01-21
5     2015-01-01    2015-01-01
6     2010-11-30    2010-11-30
7     2007-05-10    2007-05-10
8           2020    2020-01-01
9     2012-02-29    2012-02-29
10   2016 Apr 19    2016-04-19
11    2006-12-31    2006-12-31
12   2013 Jun 27    2013-06-27
13   2019 Jun 19    2019-06-19
14   2015 Jun 12    2015-06-12
15  2006 Jun-Dec           NaT
16    2006-07-31    2006-07-31
17           NaN           NaT
18    2017-04-15    2017-04-15
19   2016 May 22    2016-05-22
20      2020 Feb    2020-02-01
21    2017 May 6    2017-05-06
22   2020 Mar 11    2020-03-11
23    2013-04-30    2013-04-30
24    2020-03-07    2020-03-07
25           NaN           NaT
26          2018    2018-01-01

【讨论】:

  • 非常感谢!我试过了,它给了我很多 NaT。我现在正在检查并尝试查找我的 fmt 是否涵盖所有这些格式。
  • 我刚刚注意到诸如“2019 Nov 26”之类的格式返回到 NaT 值。当它有年份、月份的三个字母、日期时,这种格式是什么?谢谢!
  • @almo - 这是'%Y %b %d',我在你的列表末尾添加了 2 种新格式
  • @almo - 也不确定,但 'Year: %d; month' 正在解析 'Year: 10; month' 数据 - 带有文本 Yearmonth
  • @almo - 这是问题,因为没有日期的日期时间在 python 中不存在
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
相关资源
最近更新 更多