Столбец в pandas кадре данных в форме D / M / YY с двумя переменными даты и времени - PullRequest
1 голос
/ 01 мая 2020

У меня в настоящее время есть df в pandas с именем astrology, который содержит два столбца, один столбец с именем birthdate содержит даты, из которых я хотел бы создать две новые переменные DateTime) одну переменную для записи месяца и дня и другую переменную для записи года).

Мой текущий df выглядит следующим образом:

    birthdate   howMuch
       1/1/95   8
      3/15/80   7
      5/28/86   1
     11/16/61   5
     12/15/88   2

Желаемый df:

    month-day   year   howMuch
       1-1      1995    8
       3-15     1980    7
       5-28     1986    1
       11-16    1961    5
       12-15    1988    2

Текущий код, который я пробовал:

astrology['year'] =  pd.to_datetime(astrology['.birthdate'])

И я получаю ошибку:

OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 7545-07-14 00:00:00

1 Ответ

2 голосов
/ 01 мая 2020

Сначала возможен тест на правильность очистки, проверьте, есть ли некоторые даты, которые не могут быть проанализированы с to_datetime и параметром errors='coerce', поэтому не проанализированные даты и времена NaT, отфильтрованные с помощью Series.isna и boolean indexing:

print (astrology[pd.to_datetime(astrology['birthdate'], errors='coerce').isna()])

Затем используется преобразование в datetime для формата месяца и дней Series.dt.strftime и для годы Series.dt.year, но необходимо вычесть 100, чтобы избежать анализа лет выше текущего года:

dates =  pd.to_datetime(astrology['birthdate'])
y = dates.dt.year
now = pd.to_datetime('now').year
astrology = astrology.assign(monthday = dates.dt.strftime('%m/%d'),
                             year = y.mask(y > now, y - 100))
print (astrology)
  birthdate  howMuch monthday  year
0    1/1/95        8    01/01  1995
1   3/15/80        7    03/15  1980
2   5/28/86        1    05/28  1986
3  11/16/61        5    11/16  1961
4  12/15/88        2    12/15  1988

Если здесь используется столбец месяца месяца без дополняющих нулей Series.str.rsplit с выбором первых списков путем индексации str[0]:

md = astrology['birthdate'].str.rsplit('/', n=1).str[0]
dates =  pd.to_datetime(astrology['birthdate'])
y = dates.dt.year
now = pd.to_datetime('now').year
astrology = astrology.assign(monthday = md,
                             year = y.mask(y > now, y - 100))
print (astrology)
  birthdate  howMuch monthday  year
0    1/1/95        8      1/1  1995
1   3/15/80        7     3/15  1980
2   5/28/86        1     5/28  1986
3  11/16/61        5    11/16  1961
4  12/15/88        2    12/15  1988
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...