У меня есть столбец строк, как показано ниже, которые содержат информацию о дате, и мне нужно добавить начальные нули в однозначные месяцы и дни.Я столкнулся с некоторыми проблемами, пытаясь сделать это исключительно с 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
Есть две проблемы с этим, о которых я хотел бы узнать больше:
- В таких случаях, как строка 0, где указаны месяц и день.однозначные, он только находит месяц.Как я могу заставить его совпадать с обоими?
- Я не хочу пробелов, но когда я пытаюсь заменить, используя
r'\10\2'
, конечно, я получаю ошибку, потому что он думает, что я пытаюсь заменить вгруппа 10, и в первом регулярном выражении такой группы нет.Если я попытаюсь r'(\1)0\2'
, это сработает, за исключением того, что печатает буквальные скобки.Почему он это делает, и как я могу правильно написать это так, чтобы он сразу печатал группу 1, за которой следовал буквальный ноль?
Редактировать для пояснения: я знаю, что я мог бы также исправить это путем анализадаты, но я особенно заинтересован в решении регулярных выражений, в качестве учебного упражнения.Кроме того, потому что один replace
намного быстрее для больших фреймов данных.