2015-12-24 8 views
6

これはとても簡単にやるべきだと感じていますが、私はどのように考え出すことができません。代わりにパンダでのデュレーションまでの日付

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

私の試み利回りの0日の束とNaT::、のようなものを私は期間の列を持ちたい

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] 

:私は列日付pandasDataFrameを持っている

>>> 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以降、我々はdatetime.timedeltaのサブクラスである新しいスカラー型はtimedeltaを導入し、同様に動作しますが、との互換性を可能にnp.timedelta64タイプのほか、カスタム表現、解析、および属性のホストも含まれます。

タイムディーラーは、時間単位で差異があります。日、時、分、秒。彼らは肯定的でも否定的でもあります。

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 

(@Andyヘイデンによって示されているようにまたは.diff())、あなたは.shift()を使用して、時間内のポイント間の差を計算することができます。

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 
関連する問題