Преобразование форматов даты в pandas - PullRequest
0 голосов
/ 17 июня 2020

У меня есть фрейм данных:

print(df_test)

               Name Birth Date
0     Anna B Wilson   JUL 1861
1  Victor C Burnett   NOV 1847
2     Ausia Burnett   JUN 1898
3    Alfred Burnett   MAR 1896
4     Viola Burnett   AUG 1894

Я бы хотел, чтобы результат был:

               Name Birth Date
0     Anna B Wilson     7-1861
1  Victor C Burnett    11-1847
2     Ausia Burnett     6-1898
3    Alfred Burnett     3-1896
4     Viola Burnett     8-1894

Есть ли у меня краткий способ сделать это без написания отдельного регулярного выражения на каждый месяц, т.е.

df_test = df_test.replace(to_replace ='(MAR)\s(\d{4})', value = r'3-\2', regex = True)
df_test = df_test.replace(to_replace ='(JUN)\s(\d{4})', value = r'6-\2', regex = True)
df_test = df_test.replace(to_replace ='(JUL)\s(\d{4})', value = r'7-\2', regex = True)
df_test = df_test.replace(to_replace ='(AUG)\s(\d{4})', value = r'8-\2', regex = True)
df_test = df_test.replace(to_replace ='(NOV)\s(\d{4})', value = r'11-\2', regex = True)
print(df_test)

?

EDIT: Значит, есть ложка дегтя. Не все данные даты имеют одинаковый формат. Например, есть аномалии, подобные тем, что в строках 5-8:

                       Name    Birth Date
0             Anna B Wilson      JUL 1861
1          Victor C Burnett      NOV 1847
2             Ausia Burnett      JUN 1898
3            Alfred Burnett      MAR 1896
4             Viola Burnett      AUG 1894
5             Marinda Lynde          1843
6              Iola Staffen  Jan Abt 1880
7  Maryella Dolores Staffin   30 AUG 1913
8   Norman Lawrence Schmitt   22 JUN 1945

1 Ответ

0 голосов
/ 17 июня 2020

На самом деле вам не нужно регулярное выражение, вы можете использовать pd.to_datetime(), за которым следует strftime(), чтобы указать желаемый формат, например:

test_df = pd.DataFrame({'Name':['A','B','C','D','E'],
                        'Birthdate':['JUL 1861', 'NOV 1847','JUN 1898','MAR 1896','AUG 1894']})
test_df['Birthdate'] = pd.to_datetime(test_df['Birthdate'],infer_datetime_format=True).dt.strftime('%m-%Y')

Вывод:

  Name Birthdate
0    A   07-1861
1    B   11-1847
2    C   06-1898
3    D   03-1896
4    E   08-1894
...