我正在解析一个日期列,其中包含不规则的日期格式,这些格式不会被熊猫解释'。日期包括不同的语言,包括天、月和年以及不同的格式。日期条目通常还包括时间戳。(奖励:用 lambda/循环通过字符串/正则表达式分隔它们是最快的方法吗?处理这些数以万计的日期条目的最佳选择和工作流程是什么?
pandas
和dateutil.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
),但如果数据不一致,则无法直接处理列。
我希望它会有所帮助。