конвертировать разницу дней в числовые значения в python pandas

У меня есть столбец «датеф» в моем кадре данных как:

  exposuredate min_exposure_date    datedif
  2014-10-08   2014-09-27           11 days
  2014-10-09   2014-09-27           12 days
  2014-09-27   2014-09-27           0 days
  2014-09-27   2014-09-27           0 days
  2014-10-22   2014-09-27           25 days

  data.exposuredate = pd.to_datetime(data.exposuredate)
  data.min_exposure_date = pd.to_datetime(data.min_exposure_date)

  data['datedif'] = ((data.exposuredate)-(data.min_exposure_date))

Формат столбцов: datetime64[ns]. Я хочу извлечь количество дней в поле «датеф». Я не могу найти ничего, что могло бы помочь мне извлечь разницу с точки зрения количества дней.

Я попытался:

data['datedif_day'] = data['datedif'].dt.days

Ошибка:

AttributeError: объект «Серия» не имеет атрибута «dt»


person Pulkit Jha    schedule 27.01.2015    source источник
comment
Это мило. Удачи с этим. У вас есть вопрос?   -  person Marc B    schedule 27.01.2015
comment
снова цитирую mysel: я хочу извлечь количество дней в поле «датеф». Это означает, сколько дней в этом поле даты «датеф»?   -  person Pulkit Jha    schedule 27.01.2015
comment
Итак, что вы пробовали и в чем именно проблема с вашим текущим кодом? Эта не служба написания кода.   -  person jonrsharpe    schedule 27.01.2015
comment
@jonrsharpe Обновил вопрос.   -  person Pulkit Jha    schedule 27.01.2015
comment
... и в чем именно проблема с вашим текущим кодом?   -  person jonrsharpe    schedule 27.01.2015
comment
текущий код работает нормально. Я хочу знать, каким должен быть код, если я хочу извлечь количество дней из разницы дат, которую я вычислил.   -  person Pulkit Jha    schedule 27.01.2015
comment
Опять же, это не служба написания кода. Какие исследования вы провели? Что вы пробовали?   -  person jonrsharpe    schedule 27.01.2015
comment
stackoverflow.com/questions/151199/ Я просматривал такие ссылки и многие другие сообщения, но все они взяли две даты отдельно и проиллюстрировали, как это сделать. Ни один из них не показал это с форматом даты «гггг-мм-дд».   -  person Pulkit Jha    schedule 27.01.2015
comment
Удалите или закомментируйте data.datedif = pd.to_datetime(data.datedif) — тогда datedif будет Timedelta объектом.   -  person wwii    schedule 27.01.2015
comment
@wwii: Спасибо, я пытался, но получаю сообщение об ошибке. Я обновил указанную ошибку.   -  person Pulkit Jha    schedule 27.01.2015
comment
Если ваш вопрос касается pandas API; вы должны упомянуть об этом в вопросе и/или добавить его в теги, чтобы люди, которые подписаны на pandas, могли видеть ваш вопрос.   -  person jfs    schedule 28.01.2015


Ответы (3)


Документы Pandas относятся к типам конверсий, которые вы ищете, как Частота Преобразование

Два варианта: 1) деление на Timedelta или 2) преобразование типа. Между ними есть тонкая разница, как указано в документах:

"Обратите внимание, что деление на скаляр numpy является истинным делением, а атипизация эквивалентна делению пола".

data = pd.DataFrame([("2014-10-08", "2014-09-27"),
                     ("2014-10-09", "2014-09-27"),
                     ("2014-09-27", "2014-09-27"),
                     ("2014-10-22", "2014-09-27")],
                    columns=["exposuredate", "min_exposure_date"])

data['datediff'] =   pd.to_datetime(data.exposuredate) 
                   - pd.to_datetime(data.min_exposure_date)

data['datediff'] / pd.Timedelta(1, unit='d')
data['datediff'].astype('timedelta64[D]')

Обе операции дают:

0    11.0
1    12.0
2     0.0
3    25.0
Name: datediff, dtype: float64

Если вы используете разницу дат в качестве функции для обучения алгоритма машинного обучения, не имеет значения, в какой форме они представлены, поскольку они все равно должны быть нормализованы. timedelta64[ns] отлично подходит для этого. Что касается целей визуализации, см. этот пост.

person Hendrik F    schedule 14.01.2018

«Datedif» выглядит в формате дней, но на самом деле это секунды. Итак, чтобы получить количество дней для дальнейшего использования, добавьте в код следующую строку:

   data['datedif'] = data['datedif'].astype(np.numpy64)
   data['datedif_day'] = (data['datedif']/86400000000000)
person Pulkit Jha    schedule 28.01.2015

Наткнулся на этот же вопрос сегодня, и я думаю, что следующее решение является самым простым:

Настройка:

df = pd.DataFrame([("2014-10-08", "2014-09-27"),
                     ("2014-10-09", "2014-09-27"),
                     ("2014-09-27", "2014-09-27"),
                     ("2014-10-22", "2014-09-27")],
                    columns=["exposuredate", "min_exposure_date"])

df['datediff'] =   pd.to_datetime(df.exposuredate) - pd.to_datetime(df.min_exposure_date)

    exposuredate    min_exposure_date   datediff
0   2014-10-08      2014-09-27          11 days
1   2014-10-09      2014-09-27          12 days
2   2014-09-27      2014-09-27          0 days
3   2014-10-22      2014-09-27          25 days

Решение:

df.datediff.apply(lambda x: x.days)

0    11
1    12
2     0
3    25
Name: datediff, dtype: int64
person Allen    schedule 03.02.2020