Używam pandy / python i mam dwie serie dat s1 i s2, które zostały wygenerowane za pomocą funkcji „to_datetime” w polu df zawierającym daty / godziny.
Kiedy odejmuję s1 od s2
s3 = s2 - s1
Otrzymuję serię s3 typu
timedelta64 [ns]
0 385 days, 04:10:36
1 57 days, 22:54:00
2 642 days, 21:15:23
3 615 days, 00:55:44
4 160 days, 22:13:35
5 196 days, 23:06:49
6 23 days, 22:57:17
7 2 days, 22:17:31
8 622 days, 01:29:25
9 79 days, 20:15:14
10 23 days, 22:46:51
11 268 days, 19:23:04
12 NaT
13 NaT
14 583 days, 03:40:39
Jak patrzę na 1 element serii:
s3 [10]
Dostaję coś takiego:
numpy.timedelta64 (2069211000000000, 'ns')
Jak wyodrębnić dni z s3 i być może zachować je jako liczby całkowite (nie interesują mnie godziny / minuty itp.)?
Z góry dziękuję za jakąkolwiek pomoc.
s.apply(lambda x: x / np.timedelta64(1,'D'))
Odpowiedzi:
Możesz przekonwertować go na timedelta z dokładnością do dnia. Aby wyodrębnić liczbę całkowitą dni, należy podzielić ją przez czas jednego dnia.
>>> x = np.timedelta64(2069211000000000, 'ns') >>> days = x.astype('timedelta64[D]') >>> days / np.timedelta64(1, 'D') 23
Albo, jak sugeruje @PhillipCloud, po prostu
days.astype(int)
ponieważtimedelta
jest tylko całkowita 64-bitowych, które jest interpretowane w różny sposób w zależności od drugiego parametru, który przeszedł w ('D'
,'ns'
...).Więcej na ten temat znajdziesz tutaj .
źródło
days.item().days
lubdays.astype(int)
.astype('timedelta64[D]')
(około 96 ms) jest znacznie wydajniejsza niżdt.days.
(około 24 s) w przypadku 4 000 000 wierszy.Służy
dt.days
do uzyskiwania atrybutu days jako liczb całkowitych.Na przykład:
In [14]: s = pd.Series(pd.timedelta_range(start='1 days', end='12 days', freq='3000T')) In [15]: s Out[15]: 0 1 days 00:00:00 1 3 days 02:00:00 2 5 days 04:00:00 3 7 days 06:00:00 4 9 days 08:00:00 5 11 days 10:00:00 dtype: timedelta64[ns] In [16]: s.dt.days Out[16]: 0 1 1 3 2 5 3 7 4 9 5 11 dtype: int64
Bardziej ogólnie - możesz użyć tej usługi,
.components
aby uzyskać dostęp do zredukowanej formytimedelta
.In [17]: s.dt.components Out[17]: days hours minutes seconds milliseconds microseconds nanoseconds 0 1 0 0 0 0 0 0 1 3 2 0 0 0 0 0 2 5 4 0 0 0 0 0 3 7 6 0 0 0 0 0 4 9 8 0 0 0 0 0 5 11 10 0 0 0 0 0
Teraz, aby uzyskać
hours
atrybut:In [23]: s.dt.components.hours Out[23]: 0 0 1 2 2 4 3 6 4 8 5 10 Name: hours, dtype: int64
źródło
Załóżmy, że masz serię timedelta:
import pandas as pd from datetime import datetime z = pd.DataFrame({'a':[datetime.strptime('20150101', '%Y%m%d')],'b':[datetime.strptime('20140601', '%Y%m%d')]}) td_series = (z['a'] - z['b'])
Jednym ze sposobów konwersji tej kolumny lub serii timedelta jest rzutowanie jej na obiekt Timedelta (pandy 0.15.0+), a następnie wyodrębnienie dni z obiektu:
td_series.astype(pd.Timedelta).apply(lambda l: l.days)
Innym sposobem jest oddanie serialu jako timedelta64 w dniach, a następnie oddanie go jako int:
td_series.astype('timedelta64[D]').astype(int)
źródło