2015-12-24 118 views
6

我覺得這應該很容易做到,但我不知道如何。我有一個pandasDataFrame與列日期大熊貓的日期與持續時間

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] 

我想有持續時間的欄目,像這樣:

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

我嘗試產量一堆0天前NaT代替:

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

任何想法?

回答

4

您可以使用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在這裏有用:(see docs)

在v0.15.0開始,我們引入一個新的標型Timedelta,這是datetime.timedelta的子類,並以類似的方式表現,但允許與兼容性np.timedelta64類型以及一系列自定義表示,解析和屬性。

Timedeltas是時間差異,用差異單位表示,例如,幾天,幾小時,幾分鐘,幾秒鐘。它們可以是正面的也可以是負面的。

df 

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

,你可以:

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 

或者,你可以計算出使用.shift()在時間點之間的差異(或.diff()由@Andy海登所示):

res = df-df.shift() 

得到:

res.fillna(0) 

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

您可以從timedelta64dtype通過轉換這些以integer

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

0  0 
1 180 
2  1 
3  13 
4  1 
2

df.date[1:] - df.date[:-1]沒有做什麼,你認爲它。每個元素都被系列/數據框索引映射減去,而不是按系列中的位置。

計算df.date[1:] - df.date[:-1]做:

+---- 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