【发布时间】:2021-01-26 20:10:26
【问题描述】:
更新:问题现已解决:)
我之前问过一个similar question。这个答案太好了。但是现在,数据集变得更加复杂了。
根据原来的答案,我试过这样:
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/%m/%d','%Y/%d/%m','%Y%m']
dfs = [pd.to_datetime(df['Date'], format=f, errors='coerce') for f in fmt]
df['Date']= pd.concat(dfs, axis=1).bfill(axis=1).iloc[:, 0]
它在 df.date 列中给了我超过 4000 个 NaN 值。如果我删除所有这些 NaN 值,那就太多了。当我追踪日期列时,这些 NaN 值是由这些行引起的:
20050
2014/17/0
2006/0/5
2005-3-0
2006-18-0
2004/24/7
关于我应该如何处理它们的任何想法?我正在考虑用零到一替换那些月份/日期,如下所示:
20500 =====> 2005-01-01
2014/17/0 =====> 2004-01-17
2006/0/5 =====> 2006-01-05
2005-3-0 =====> 2005-03-01
2006-18-0 =====> 2006-01-18
注意:日期的某些行是年/月/日格式,而其他行可能是年/日/月或简单的 YearDate
感谢您的帮助!
[![在此处输入图片描述][2]][2]
以下是一些打印出来的日期格式:
2002-11-25
2001-11-25
2002-9-27
2001-2-24
2002-9-20
2001-5-3
2002-2-28
200510
2004/19/10
2006-11-01
2004/22/3
20055
2004/28/4
2006-6-01
20057
20050
2006-10-01
2004/17/0
2006-6-01
2006-3-01
2001-4-4
2001-6-19
2003/16/11
20054
20065
20057
2006-2-01
2003/0/1
2002-1-27
20057
2006-5-01
20065
2006-0-01
2006-9-01
2002-6-28
20054
2001-1-25
2006-0-01
2006-3-01
2006-1-01
2006-1-01
2004/5/2
2003/3/4
2002-10-13
2006-6-01
2004/24/1
2002-11-11
2001-4-9
2003/21/4
2002-4-1
2004/24/7
通过 jezrael 的解决方案,我成功地将 NaT 值从 4000 多行减少到仅 300 行左右。这 300 行中的数据格式如下:
Date Date1
238 2001-01-0 NaT
249 2001-1-0 NaT
277 2001-2-0 NaT
506 2002-1-0 NaT
535 2002-4-0 NaT
58510 2001-1-0 NaT
58516 2001-1-0 NaT
58779 2002-3-0 NaT
58888 2001-3-0 NaT
58889 2002-8-0 NaT
【问题讨论】: