преобразувайте разликата в дните в числови стойности в python pandas

Имам колона "datedif" в моята рамка с данни като:

  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]. Искам да извлека броя на дните в полето 'datedif'. Не мога да намеря нищо, което би могло да ми помогне да извлека разликата по отношение на броя на дните.

Опитах:

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

Грешка:

AttributeError: Обектът „Series“ няма атрибут „dt“


person Pulkit Jha    schedule 27.01.2015    source източник
comment
Това е хубаво. Късмет с това. Имахте ли въпрос?   -  person Marc B    schedule 27.01.2015
comment
отново цитирам mysel: искам да извлека броя на дните в полето 'datedif'. Това означава колко дни има в това поле за дата 'datedif'?   -  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 Docs се отнасят до типовете реализации, които търсите като Честота Преобразуване

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

"Имайте предвид, че делението с numpy скалара е истинско деление, докато astyping е еквивалентно на деление на етаж."

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