嗨,我想提取数据框列中的日期,并且日期之间用“-”或“至”分隔
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
答案 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
。