Python: Konwertuj timedelta na int w ramce danych

111

Chciałbym utworzyć kolumnę w ramce danych pandy, która jest liczbą całkowitą reprezentującą liczbę dni w kolumnie timedelta. Czy można użyć „datetime.days”, czy też muszę zrobić coś więcej ręcznie?

kolumna timedelta

7 dni, 23:29:00

Kolumna z liczbą całkowitą dnia

7

Asaf Hanish
źródło
12
Czy próbowałeś użyć timedelta.days?
Ffisegydd

Odpowiedzi:

162

Użyj dt.daysatrybutu. Uzyskaj dostęp do tego atrybutu przez:

timedelta_series.dt.days

Możesz również uzyskać atrybuty secondsi microsecondsw ten sam sposób.

abeboparebop
źródło
11
Podoba mi się ten komentarz ze względu na prostotę i brak konieczności importowania innej biblioteki.
NickBraunagel
68

Możesz to zrobić, gdzie tdjest twoja seria timedeltas. Podział konwertuje delty nanosekund na delty dzienne, a konwersja na int spada na całe dni.

import numpy as np

(td / np.timedelta64(1, 'D')).astype(int)
chrisb
źródło
1
Dzięki! Po kolejnych 15 minutach poszukiwań znalazłem to. stackoverflow.com/questions/18215317/…
Asaf Hanish
co to jest /pomiędzy tda np?
Jason Goal
Jest to operator działu timedelta64. Dzielenie td przez jednodniową deltę czasu daje (prawdopodobnie ułamkową) liczbę dni przedstawioną w td. Nie jest to wymagane w tym przypadku, ale jest naprawdę przydatne, jeśli chcesz obliczyć, ile 15-minutowych interwałów td reprezentuje
David Waterworth
22

Obiekty timedelta tylko do odczytu atrybuty instancji .days, .secondsoraz .microseconds.

Qiao Zhang
źródło
6

Jeśli pytanie nie dotyczy tylko „jak uzyskać dostęp do postaci całkowitej z timedelty?” ale "jak przekonwertować kolumnę timedelta w dataframe na int?" odpowiedź może być trochę inna. Oprócz .dt.daysakcesor trzeba albo df.astypealbopd.to_numeric

Każda z tych opcji powinna pomóc:

df['tdColumn'] = pd.to_numeric(df['tdColumn'].dt.days, downcast='integer')

lub

df['tdColumn'] = df['tdColumn'].dt.days.astype('int16')
CheapSquier
źródło
Cześć, próbowałem tego, ale otrzymałem ValueError: nie można przekonwertować wartości nieskończonych (NA lub inf) na liczbę całkowitą, ponieważ w serii pand są nans. Czy wiesz, kto to załatwić ???
Pablito
Druga opcja działała dla mnie, a wartości dat były typu timedelta64[ns]. Jeśli twoje daty są NaN, najpierw przekonwertuj je na datę i godzinę za pomocą pandto_datetime funkcji , a następnie użyj drugiej opcji powyżej. Aby uzyskać więcej informacji, sprawdź to_datetime
Onen simon