RegEx用于在最后一个连字符之前提取一定数量的字符

时间:2019-05-12 08:38:54

标签: python regex pandas dataframe datetime

嗨,我想提取数据框列中的日期,并且日期之间用“-”或“至”分隔

 pop       DATE                     
 0  1.5   OWREAP-01/06/18to30/06/18  
 1  1.7   OW - 01/07/18 - 30/08/18     
 2  3.6   BCREAP - 01/08/18 to 30/08/18 
 3  2.4   BCGRA TO 01/08/18 to 30/08/18

我尝试将“ to”和“ TO”替换为“-”

df['DATE'].str.replace('to|TO','-')
 pop       DATE                     
 0  1.5   OWREAP-01/06/18-30/06/18  
 1  1.7   OW - 01/07/18 - 30/08/18     
 2  3.6   BCREAP - 01/08/18 - 30/08/18 
 3  2.4   BCGRA - 01/08/18 - 30/08/18

现在我需要知道如何在最后一个连字符之前和之后提取8个字符 即

 pop       type   startdate enddate                    
 0  1.5   OWREAP  01/06/18  30/06/18  
 1  1.7   OW      01/07/18  30/08/18     
 2  3.6   BCREAP  01/08/18  30/08/18 
 3  2.4   BCGRA   01/08/18  30/08/18

2 个答案:

答案 0 :(得分:3)

您可以使用

reg = r'(?i).*(\d{2}/\d{2}/\d{2}(?:\d{2})?)\s*(?:TO|-)\s*(\d{2}/\d{2}/\d{2}(?:\d{2})?)'
df[['startdate','enddate']] = df.pop('DATE').str.extract(reg)

请参见regex demo

详细信息

  • (?i)-不区分大小写的标志
  • .*-任意0个以上的字符,并且尽可能多
  • (\d{2}/\d{2}/\d{2}(?:\d{2})?)-开始日期捕获组:2位数字,/,2位数字,/,2位或4位数字
  • \s*-超过0个空格
  • (?:to|-)-to-
  • \s*
  • \s*-超过0个空格
  • (\d{2}/\d{2}/\d{2}(?:\d{2})?)-结束日期捕获组:2位数字,/,2位数字,/,2位或4位数字

Python测试:

df = pd.DataFrame( {'DATE': ["OWREAP-01/06/18to30/06/18"],
                    'dummy': ["value"]})
reg = r'(?i).*(\d{2}/\d{2}/\d{2}(?:\d{2})?)\s*(?:to|-)\s*(\d{2}/\d{2}/\d{2}(?:\d{2})?)'
df[['startdate','enddate']] = df.pop('DATE').str.extract(reg)
>>> df
   dummy startdate   enddate
0  value  01/06/18  30/06/18

答案 1 :(得分:2)

使用splat = df.DATE.str.split(expand=True)进行拆分以获取:

        0   1         2   3         4
0  OWREAP   -  01/06/18  to  30/06/18
1      OW   -  01/07/18   -  30/08/18
2  BCREAP   -  01/08/18  to  30/08/18
3   BCGRA  TO  01/08/18  to  30/08/18

然后splat[2]是您的startdate列,而splat[4]enddate