2015-12-24 11 views
6

Mam wrażenie, że powinno to być zrobione bardzo łatwo, ale nie wiem, jak to zrobić. Mam pandasDataFrame z kolumny datę:Daty do czasu trwania w Pandach

0 2012-08-21 
1 2013-02-17 
2 2013-02-18 
3 2013-03-03 
4 2013-03-04 
Name: date, dtype: datetime64[ns] 

Chcę mieć kolumny trwania, coś takiego:

0 0 
1 80 days 
2 1 day 
3 15 days 
4 1 day 
Name: date, dtype: datetime64[ns] 

Moja plony próba grono 0 dni i NaT Zamiast:

>>> df.date[1:] - df.date[:-1] 
0  NaT 
1 0 days 
2 0 days 
... 

Jakieś pomysły?

Odpowiedz

4

Można użyć diff:

In [11]: s 
Out[11]: 
0 2012-08-21 
1 2013-02-17 
2 2013-02-18 
3 2013-03-03 
4 2013-03-04 
Name: date, dtype: datetime64[ns] 

In [12]: s.diff() 
Out[12]: 
0  NaT 
1 180 days 
2  1 days 
3 13 days 
4  1 days 
Name: date, dtype: timedelta64[ns] 

In [13]: s.diff().fillna(0) 
Out[13]: 
0  0 days 
1 180 days 
2  1 days 
3 13 days 
4  1 days 
Name: date, dtype: timedelta64[ns] 
6

Timedeltas są użyteczne tutaj: (see docs)

Począwszy v0.15.0, wprowadzamy nowy rodzaj skalarnego timedelta, która jest podklasą datetime.timedelta i zachowuje się w podobny sposób, ale umożliwia kompatybilność z Typy np.timedelta64, a także szereg niestandardowych reprezentacji, parsowania i atrybutów.

Timedeltas to różnice w czasie wyrażone w jednostkach różnic, np. dni, godziny, minuty, sekundy. Mogą być zarówno pozytywne, jak i negatywne.

df 

      0 
0 2012-08-21 
1 2013-02-17 
2 2013-02-18 
3 2013-03-03 
4 2013-03-04 

Mogłabyś:

pd.to_timedelta(df) 

TimedeltaIndex(['0 days'], dtype='timedelta64[ns]', freq=None) 
0  0 
1 180 
2  1 
3  13 
4  1 
Name: 0, dtype: int64 

Alternatywnie, można obliczyć różnicę między punktami w czasie przy użyciu .shift() (lub .diff() co ilustruje @Andy Hayden):

res = df-df.shift() 

aby uzyskać:

res.fillna(0) 

     0 
0 0 days 
1 180 days 
2 1 days 
3 13 days 
4 1 days 

można przekonwertować te z timedelta64dtype do integer używając:

res.fillna(0).squeeze().dt.days 

0  0 
1 180 
2  1 
3  13 
4  1 
2

df.date[1:] - df.date[:-1] nie robi tego, co myślisz, że to robi. Każdy element jest odejmowany przez mapowanie indeksu serii/danych, a nie według lokalizacji w serii.

Obliczanie df.date[1:] - df.date[:-1] robi:

+---- index of df.date[1:] 
|      +---- index of df.date[:-1] 
|      | 
|      v 
v      
        - 0 2012-08-21 = NaT 
1 2013-02-17 - 1 2013-02-17 = 0 
2 2013-02-18 - 2 2013-02-18 = 0 
3 2013-03-03 - 3 2013-03-03 = 0 
4 2013-03-04 -      = NaT 
Powiązane problemy