我正在解析一个日期列,其中包含 pandas 无法解释的不规则日期格式。日期包括表示日、月和年的不同语言以及不同的格式。日期条目通常还包括时间戳。 (奖励:用 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
"ValueError: ('Unknown string format:', '1 JuneMay 2000')"
我意识到这可能是一项繁琐且不受欢迎的任务。幸运的是,这些日期目前对我的项目来说并不重要,因此它们可能会被保留,但解决方案将是有利的。感谢您的任何回复,谢谢。
最佳答案
逐行,你的很多日期都有效:
>>> pd.to_datetime('19.8.2017, 21:23:32')
Timestamp('2017-08-19 21:23:32')
但是还有很多问题:
- 由于您的格式不规则,pandas 无法猜测 01-02-2019 是 2019 年 2 月 1 日还是 2019 年 1 月 2 日,我不知道您是否可以,
- 您的一些示例无法转换为日期
五月 18 日星期六
:哪一年? - 有不同语言的月份和日期(aprile 似乎是意大利语,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
值还剩下什么。
翻译时,可以尝试替换单词,但会很长。
这确实很慢(由于逐行应用
),但如果您的数据不一致,您就无法直接在列上工作。
希望对您有所帮助。
关于python - 如何解析pandas中不规则的日期格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57191952/