Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用正则表达式将命名组拆分为日期格式的列_Python_Regex_Regex Group - Fatal编程技术网

Python 无法使用正则表达式将命名组拆分为日期格式的列

Python 无法使用正则表达式将命名组拆分为日期格式的列,python,regex,regex-group,Python,Regex,Regex Group,我正试图从作为pandas的系列对象读取的文本中提取日期格式。我已经成功地编写了用于提取所有复杂日期格式的正则表达式,但在将组提取为命名组时,我面临着巨大的困难。主要的问题是,我在表达式中使用了非捕获组,因此很难将它们作为命名组 我需要的输出是数据框的形式,列为提取的完整日期,后跟年、月和日期。示例输入如下所示: df5 = pd.Series( ["04/20/2009", "04/20/09", "4/20/09", &qu

我正试图从作为pandas的
系列
对象读取的文本中提取日期格式。我已经成功地编写了用于提取所有复杂日期格式的正则表达式,但在将组提取为命名组时,我面临着巨大的困难。主要的问题是,我在表达式中使用了非捕获组,因此很难将它们作为命名组

我需要的输出是数据框的形式,列为提取的完整日期,后跟年、月和日期。示例输入如下所示:

df5 = pd.Series(
    ["04/20/2009", "04/20/09", "4/20/09", "4/3/09", "Mar-20-2009", 
     "Mar 20, 2009", "March 20, 2009", "Mar. 20, 2009", "Mar 20 2009", 
     "20 Mar 2009","20 March 2009", "20 Mar. 2009", "20 March, 2009", 
     "Mar 20th, 2009", "Mar 21st, 2009", "Mar 22nd, 2009", "Feb 2009", 
     "Sep 2009", "Oct 2010", "6/2008","12/2009", "2009", "2010"])
我用于提取的表达式是:

df5.str.extractall(r'((?:\d{1,2})?[/ ]*?(?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z\., -/]*)?(?:\d{1,2}[a-z, -/]*)?\d{2,4})')
我无法执行将日期拆分为年、月和日的后续步骤。我曾尝试使用
re.compile
re.search
进行拆分,但我无法理解它引发的错误

TypeError:无法在类似字节的对象上使用字符串模式

附言:我看了很多类似于堆栈溢出的问题,比如
, . 我要提取的日期格式非常复杂,我已经尝试了将近一周,所以请不要轻易地重复结束问题。

回答实际目标:

您可以使用预先存在的函数,而不是尝试使用正则表达式吗?如果是这样,那么只需使用
pd.to\u datetime
。它成功地解析了您的示例数据

pd.to_datetime(df5)
# outputs:
0    2009-04-20
1    2009-04-20
2    2009-04-20
3    2009-04-03
4    2009-03-20
5    2009-03-20
6    2009-03-20
7    2009-03-20
8    2009-03-20
9    2009-03-20
10   2009-03-20
11   2009-03-20
12   2009-03-20
13   2009-03-20
14   2009-03-21
15   2009-03-22
16   2009-02-01
17   2009-09-01
18   2010-10-01
19   2008-06-01
20   2009-12-01
21   2009-01-01
22   2010-01-01
dtype: datetime64[ns]
要提取日期组件,可以使用
.dt
访问器

产生数据帧的完整解决方案示例:

pd.concat([
  df5.rename('date_str'),
  pd.to_datetime(df5).dt.year.rename('year'),
  pd.to_datetime(df5).dt.month.rename('month'),
  pd.to_datetime(df5).dt.date.rename('date')
], axis=1)

          date_str  year  month        date
0       04/20/2009  2009      4  2009-04-20
1         04/20/09  2009      4  2009-04-20
2          4/20/09  2009      4  2009-04-20
3           4/3/09  2009      4  2009-04-03
4      Mar-20-2009  2009      3  2009-03-20
5     Mar 20, 2009  2009      3  2009-03-20
6   March 20, 2009  2009      3  2009-03-20
7    Mar. 20, 2009  2009      3  2009-03-20
8      Mar 20 2009  2009      3  2009-03-20
9      20 Mar 2009  2009      3  2009-03-20
10   20 March 2009  2009      3  2009-03-20
11    20 Mar. 2009  2009      3  2009-03-20
12  20 March, 2009  2009      3  2009-03-20
13  Mar 20th, 2009  2009      3  2009-03-20
14  Mar 21st, 2009  2009      3  2009-03-21
15  Mar 22nd, 2009  2009      3  2009-03-22
16        Feb 2009  2009      2  2009-02-01
17        Sep 2009  2009      9  2009-09-01
18        Oct 2010  2010     10  2010-10-01
19          6/2008  2008      6  2008-06-01
20         12/2009  2009     12  2009-12-01
21            2009  2009      1  2009-01-01
22            2010  2010      1  2010-01-01

TypeError:无法在类似字节的对象上使用字符串模式

上述错误表明列的类型是
bytes
,而不是
str

此示例代码将引发相同的异常

re.findall('hello', b'hello kitty')
字节必须与字节进行模式匹配,或者首先解码为str,然后再与字符串模式进行模式匹配,因此,修复上述行的两种方法是将模式替换为
b'hello'
,或者将源字符串解码为某个内容(例如
b'hello kitty'。解码('ascii')#'utf8也可以使用

要将bytes列解码为str,可以使用
str
访问器并使用如上所示的`解码方法

范例

df5.str.decode('utf8') 

但是,我不确定您的正则表达式是否有效,但我不会尝试修复这一点,因为我相信您的目标可以在较低的复杂性下实现。

当源文本不具有该粒度(例如,系列中的最后3个值)时,
&
日期
列中您想要什么?如果您显式地提供了预期的输出,则会更加清楚。@Haleemuli哦,是的。可以假设,如果没有月份,默认情况下它对应于第一个月,如果没有日期和月份,则可以假设它是第一个月的第一天。感谢您的建议。我把它作为了解正则表达式任务的一部分来实现。最后一个建议是将字节转换为字符串还是将字符串转换为字节?对pd系列有效吗?