Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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 - Fatal编程技术网

在python中从文本中提取多个日期

在python中从文本中提取多个日期,python,regex,Python,Regex,我有一个像这样的数据框 Unit ID Shipping to: 90 With x 91 With y 92 With z 116 Shipped to x 01/04/16. / Shipped to y - 09/08/18. 233 Shipped to z 03/01/17 265 Shipped to x 03/01/17 returned shipped to x 02/05/17 280

我有一个像这样的数据框

Unit ID   Shipping to:
90        With x
91        With y
92        With z
116       Shipped to x 01/04/16. / Shipped to y - 09/08/18.
233       Shipped to z 03/01/17
265       Shipped to x 03/01/17 returned shipped to x 02/05/17
280       Shipped to x 06/01/17  Shipped to y 03/05/17 Shipped to z 12/12/17
我想能够提取所有发生的x,y或z和日期,它后面的,如果有一个。我无法确定z、y或z将出现多少次,但我希望最终结果如下所示:

 Unit ID  Occurrence 1  Occurrence 2  Occurrence 3 Shipping to:
    90    x                                        With x
    91    y                                        With y
    92    z                                        With z
    116   x 01/04/16    y 09/08/18                 Shipped to x 01/04/16. / Shipped to y - 09/08/18.
    233   z 03/01/17                               Shipped to z 03/01/17
    265   x 03/01/17                               Shipped to x 03/01/17 returned shipped to x 02/05/17
    280   x 06/01/17    y 03/05/17    z 12/12/17   Shipped to x 06/01/17  Shipped to y 03/05/17 Shipped to z 12/12/17
到目前为止,我只使用这个函数提取了每一列中出现的第一个日期

date_col = []
for row in df['Shipping to:']:
    match = re.search('\d{2}/\d{2}/\d{2}',str(row),re.IGNORECASE)
    date_col.append(match)
df['dates'] = date_col

数据帧本身有一个非常好的功能:

df['Shipping to:'].str.extractall(r'(\d{1,2}/\d{1,2}/\d{2})').unstack()
请注意,我将您的正则表达式更改为包含一个组(带有
()
),并且我还匹配了月份和日期的个位数

测试以下数据帧(我知道这是胡说八道,但这只是一个测试):

我得到这个输出:

match   0   1
0   1/22/33     NaN
1   2/33/44     NaN
2   22/4/55     NaN
5   22/5/66     11/22/33
要在开始处包括x/y/z,请将正则表达式更改为
r'([xyz]\d{1,2}/\d{1,2}/\d{2})
。最后,如果要将这些匹配项作为新列添加到原始数据帧中,可以使用
join
。然后,代码变为:

df.join(df['Shipping to:'].str.extractall(r'([xyz] \d{1,2}/\d{1,2}/\d{2})')\
    .unstack()[0])
请注意,我在调用
unstack
后得到了第0列-这有效地删除了1级多索引,并防止
join
抱怨。现在,正是因为我很高兴地处理了这个问题,我添加了一些代码来修复列名,以便它们与您的示例相匹配:

df.join(df['Shipping to:'].str.extractall(r'([xyz] \d{1,2}/\d{1,2}/\d{2})')\
    .unstack()[0]\
    .rename(columns=lambda x: "Occurence " + str(x)))

看起来,我。E给出一些例子远远低于硬接线规范。允许哪些格式变体,最多出现多少次,日期顺序(m/d/y)是什么,等等。因此,大多数工作与Python无关,但需要细化规范。@guidot似乎很清楚,匹配其日期的正则表达式是
\d{2}/\d{2}/\d{2}
,我想说这是非常具体的。@rje:那么,d{2}/\d{2}是哪一个呢{2} 你猜与月份相关吗?拒绝或不识别非法的日期和月份不是很好吗?@guidot我想这不是regex的任务。使用regex查找候选日期,然后使用解析器过滤非法的日期和月份。
df.join(df['Shipping to:'].str.extractall(r'([xyz] \d{1,2}/\d{1,2}/\d{2})')\
    .unstack()[0]\
    .rename(columns=lambda x: "Occurence " + str(x)))