Переформатировать дату внутри строки с помощью панд заменить на регулярное выражение - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть столбец строк, как показано ниже, которые содержат информацию о дате, и мне нужно добавить начальные нули в однозначные месяцы и дни.Я столкнулся с некоторыми проблемами, пытаясь сделать это исключительно с pandas.DataFrame.replace и регулярными выражениями.

import pandas as pd
df = pd.DataFrame({'Key':['0123456789_1/2/2019','0123456789_11/23/2019','0145892367_10/2/2019','0145892367_4/13/2019']})

df
Out[323]: 
                     Key
0    0123456789_1/2/2019
1  0123456789_11/23/2019
2   0145892367_10/2/2019
3   0145892367_4/13/2019

Для приведенного выше столбца вывод, который я хотел бы получить после переформатирования, будет:

                     Key
0  0123456789_01/02/2019
1  0123456789_11/23/2019
2  0145892367_10/02/2019
3  0145892367_04/13/2019

К настоящему времени я понял, что могу сделать это, разделив строки:

r = df['Key'].str.split('_|/', expand=True)
df2 = r[0] + '_' + r[1].str.zfill(2) + '/' + r[2].str.zfill(2) + '/' + r[3]

df2
Out[333]: 
0    0123456789_01/02/2019
1    0123456789_11/23/2019
2    0145892367_10/02/2019
3    0145892367_04/13/2019
dtype: object

... Но когда я первоначально пытался сделать это с pandas.DataFrame.replace, самым близким былсмог получить:

df2 = df.replace(r'(_|/)([1-9]/)',r'\1 0\2',regex=True)

df2
Out[335]: 
                      Key
0   0123456789_ 01/2/2019
1   0123456789_11/23/2019
2  0145892367_10/ 02/2019
3  0145892367_ 04/13/2019

Есть две проблемы с этим, о которых я хотел бы узнать больше:

  1. В таких случаях, как строка 0, где указаны месяц и день.однозначные, он только находит месяц.Как я могу заставить его совпадать с обоими?
  2. Я не хочу пробелов, но когда я пытаюсь заменить, используя r'\10\2', конечно, я получаю ошибку, потому что он думает, что я пытаюсь заменить вгруппа 10, и в первом регулярном выражении такой группы нет.Если я попытаюсь r'(\1)0\2', это сработает, за исключением того, что печатает буквальные скобки.Почему он это делает, и как я могу правильно написать это так, чтобы он сразу печатал группу 1, за которой следовал буквальный ноль?

Редактировать для пояснения: я знаю, что я мог бы также исправить это путем анализадаты, но я особенно заинтересован в решении регулярных выражений, в качестве учебного упражнения.Кроме того, потому что один replace намного быстрее для больших фреймов данных.

Ответы [ 2 ]

3 голосов
/ 18 апреля 2019

IIUC, вы можете использовать:

df.Key=df.Key.str.split("_").str[0]+"_"+pd.to_datetime(df.Key.str.split("_")
            .str[1]).dt.strftime('%m/%d/%Y')
print(df)

                     Key
0  0123456789_01/02/2019
1  0123456789_11/23/2019
2  0145892367_10/02/2019
3  0145892367_04/13/2019
1 голос
/ 18 апреля 2019

с использованием datetime module

df['Key'] = df.Key.str.split('_').apply(lambda x: x[0]+'_'+datetime.strptime(x[1], "%m/%d/%Y").strftime("%m/%d/%Y"))

выход

                     Key
0  0123456789_01/02/2019
1  0123456789_11/23/2019
2  0145892367_10/02/2019
3  0145892367_04/13/2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...