如何解析熊猫中的不规则日期格式?



我正在解析一个日期列,其中包含不规则的日期格式,这些格式不会被熊猫解释'。日期包括不同的语言,包括天、月和年以及不同的格式。日期条目通常还包括时间戳。(奖励:用 lambda/循环通过字符串/正则表达式分隔它们是最快的方法吗?处理这些数以万计的日期条目的最佳选择和工作流程是什么?

pandasdateutil.parser未知的条目。

示例包括:

19.8.2017, 21:23:32 
31/05/2015 19:41:56   
Saturday, 18. May  
11 - 15 July 2001 
2019/4/28 下午6:29:28 
1 JuneMay 2000    
19 aprile 2008 21:16:37 GMT+02:00 
Samstag, 15. Mai 2010 20:55:10   
So 23 Jun 2007 23:45 CEST                                       
28 August 1998                                                 
30 June 2001    
1 Ноябрь 2008 г. 18:46:59  
Sat Jun 18 2011 19:46:46 GMT+0200 (Romance Daylight Time) 
May-28-11 6:56:08 PM
Sat Jun 26 2010 21:55:54 GMT+0200 (West-Europa (zomertijd))
lunedì 5 maggio 2008 9.30.33 

"值错误: ('未知字符串格式: ', '1 六月五月 2000')">

我意识到这可能是一项繁琐和不受欢迎的任务。幸运的是,这些日期目前对我的项目并不重要,所以它们可能会被单独留下,但解决方案将是有利的。感谢任何和所有回复,谢谢。

一行一行,你的很多约会都有效:

>>> pd.to_datetime('19.8.2017, 21:23:32')
Timestamp('2017-08-19 21:23:32')

但是有很多事情:

  • 由于你的格式不规则,熊猫无法猜测01-02-2019是2019年2月1日还是2019年1月2日,我不知道你能不能,
  • 您的一些示例无法转换为日期Saturday, 18. May:哪一年?
  • 有不同语言的月份和日期(四月似乎是意大利语,Samstag是德语)
  • 您的一些示例在没有括号内容的情况下工作:
>>> pd.to_datetime('Sat Jun 18 2011 19:46:46 GMT+0200')  # works
Timestamp('2011-06-18 19:46:46-0200', tz='pytz.FixedOffset(-120)')
>>> pd.to_datetime('Sat Jun 18 2011 19:46:46 GMT+0200 (Romance Daylight Time) ')  # doesn't work.
...
ValueError: ('Unknown string format:', 'Sat Jun 18 2011 19:46:46 GMT+0200 (Romance Daylight Time) ')

可以肯定的是,您不能将所有日期都放入时间戳中,我会尝试创建一个新列,其中包含时间戳中正确解析的日期,而另一个则另存为NaT

例如:

date
02-01-2019
Saturday, 18. May

将成为:

date               new date
02-01-2019         Timestamp('2019-01-02 00:00:00.00)
Saturday, 18. May  NaT

为此,我将删除初始列中的括号:

df2 = df.assign(
date2=lambda x: x['date'].str.split('(')[0],
new_date=lambda x: x['date2'].apply(lambda y: pd.to_datetime(y, errors='coerce'), axis='columns')) # apply the function row by row
# This will work with python >= 3.6

之后,您可以看到保留NaT值的剩余内容。

对于翻译,您可以尝试替换单词,但它会很长。

这真的很慢(由于逐行apply),但如果数据不一致,则无法直接处理列。

我希望它会有所帮助。

最新更新