【发布时间】:2018-01-12 06:37:21
【问题描述】:
我正在研究一个由数千(行)字符串表达式组成的单列熊猫数据框。每个字符串可能包含不同格式的“日期”信息,例如:
05/10/2001; 05/10/01; 5/10/09; 6/2/01
May-10-2001; May 10, 2010; March 25, 2001; Mar. 25, 2001; Mar 25 2001;
25 Mar 2001; 25 March 2001; 25 Mar. 2001; 25 March, 2001
Mar 25th, 2001; Mar 25th, 2001; Mar 12nd, 2001
Feb 2001; Sep 2001; Oct 2001
5/2001; 11/2001
2001; 2015
以几个字符串为例:
df[0] he plans to depart on 6/12/95
df[1] as of Mar. 23rd, 2011, the board decides that...
df[2] the 12-28-01 record shows...
我想在 df 之后使用 findall() 函数,以便 df.str.findall(r'') 提取日期元素:
[0] 6/12/95
[1] Mar. 23rd, 2011
[2] 12-28-01
从原始字符串,然后是一些“排序”命令行,以按时间顺序按索引对提取的日期进行排序,以便输出看起来像
[0] 1
[1] 3
[2] 2
我(暂时)使用以下函数
df.str.findall(r'(?:\d{2} )?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* (?:\d{2}, )?\d{4}')
但不知道如何处理
(1) 数字后序号:st, th, nd
(2) 偶尔出现的“.”代表缩写的值,以及
(3) 斜线 (/) 和连字符 (-)
一次性使用正则表达式 final 函数。
此外,在所有提取工作完成后,我想用它们各自的索引(即 1、2、3、...、n)按时间顺序对它们进行排序。但是我目前对正则表达式的了解不足以了解 Python 如何按时间顺序对这些不同的日期格式进行排序。
如果有人能为此提供一些关于 .findall() 函数的方便技巧或解释排序日期表达式的机制,将不胜感激。
【问题讨论】:
-
请举例说明表达式应该匹配什么以及应该捕获什么
-
我会将其添加到编辑后的文本中。感谢您解决这个问题。
-
我认为这真的很难,实际上不可能在一个 .findall() 命令中提取各种日期格式。我想知道是否可以为每种日期格式一个一个地执行此操作,将它们堆叠在一起,最后使用 .to_datetime() 将它们转换为相同的格式“yyyy-mm-dd”?