Преобразовать ДД-МММ-ГГ в ГГГГ / ММ / ДД в Pandas - PullRequest
1 голос
/ 15 апреля 2020
* В столбце DoB

в моем наборе данных есть дата в следующем формате:

0       12-Jan-79
1       13-Jan-70
2       11-Mar-84
3       11-Mar-84
4       01-May-86
          ...    
1080    15-Mar-81
1081    07-Jul-96
1082    11-Apr-90
1083    22-Oct-64
1084    12-Jul-95

Мне нужно преобразовать ее в стандартный формат даты ГГГГ / ММ / ДД.

Я пытался df['DateOfBirth'] = pd.to_datetime(df['DateOfBirth']). Это работает нормально для большинства случаев.

Но в некоторых случаях, таких как 22-Oct-64, я могу наблюдать, как данные преобразуются в будущие даты, например 2064-10-22.

Я хочу попробовать что-то вроде DoB.str[:-2]+'19'+DoB.str[-2:] на весь столбец.

Как решить проблему?

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Вы можете сделать это. Возьмите мой пример df, например:

In [922]: df                                                                                                                                                                                                
Out[922]: 
         DOB
0  22/Oct/64

In [925]: df['DOB'] = pd.to_datetime(df['DOB'])

In [927]: from datetime import timedelta, date

In [928]: future = df['DOB'] > date(year=2050,month=1,day=1)
In [930]: df.loc[future, 'DOB'] -= timedelta(days=365.25*100)

In [931]: df                                                                                                                                                                                                
Out[931]: 
         DOB
0 1964-10-22

Это также поможет решить проблемы с будущими датами.

Из docs

Проблемы 2000 года (2000 года): Python зависит от библиотеки C платформы, которая обычно не имеет проблем 2000 года, поскольку все даты и время представляются внутри в виде секунд с момента эпоха. Функция strptime () может анализировать 2-х git лет, если задан код формата% y. Когда 2-ди git годы анализируются, они преобразуются в соответствии со стандартами POSIX и ISO C: значения 69–99 отображаются на 1969–1999, а значения 0–68 отображаются на 2000–2068.

0 голосов
/ 16 апреля 2020

Цель может быть достигнута путем вырезания двух символов , , добавления 19 и затем вставки последних двух символов .

df['DateOfBirth']

Out[14]:
0       12-Jan-79
1       13-Jan-70
2       11-Mar-84
3       11-Mar-84
4       01-May-86
          ...    
1080    15-Mar-81
1081    07-Jul-96
1082    11-Apr-90
1083    22-Oct-64
1084    12-Jul-95
Name: DateOfBirth, Length: 1085, dtype: object

Код: df['DateOfBirth'] = df['DateOfBirth'].str[:-2]+'19'+df['DateOfBirth'].str[-2:]

Вывод:

Out[16]:
0       12-Jan-1979
1       13-Jan-1970
2       11-Mar-1984
3       11-Mar-1984
4       01-May-1986
           ...     
1080    15-Mar-1981
1081    07-Jul-1996
1082    11-Apr-1990
1083    22-Oct-1964
1084    12-Jul-1995
Name: DateOfBirth, Length: 1085, dtype: object

Просто используйте df['DateOfBirth'] = pd.to_datetime(df['DateOfBirth']) для преобразования столбца в формат даты и времени.

0 голосов
/ 15 апреля 2020

Вы должны указать формат:

df['DateOfBirth'] = pd.to_datetime(df['DateOfBirth'], '%d/%m/%y')
...