RegEx для извлечения определенного числа символов перед последним дефисом - PullRequest
4 голосов
/ 12 мая 2019

Привет! Я хочу извлечь даты в столбце данных, а даты разделяются на «-» или «на»

 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» на «-»"

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 ]

3 голосов
/ 12 мая 2019

Вы можете использовать

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 .

Детали

  • (?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 test:

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
2 голосов
/ 12 мая 2019

Разделить, используя 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...