python - 将多种日期格式解析为一种格式
问题描述
我有一个名为已发布(日期)的专栏。如您所见,它有多种日期格式和 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
解决方案
首先添加了 2 种新格式以fmt
列出:
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/YYYY
vsmm/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
推荐阅读
- c# - ASP.NET MVC 不良做法:具有可选和必需属性的模型
- python - Python Selenium Page Scroll Down(页面分为两个,2个scollers)
- ubuntu - 如何配置 apport 以收集核心转储,但不上传?
- c - C根据给定的整数值调用不同的函数
- unity3d - how do I toggle 'solo' and 'mute' from script (animator)
- fortran - Fortran - 写语句影响后续计算
- c# - C# - 如何遍历类中的所有字段并在这些字段上调用方法?
- html - httpd 禁止访问不是在 /var/www/html/ 中创建的文件
- c++ - 为什么控制台要求更多输入?C++
- android - 如何在意图引用的活动中触发动作?