2015-12-24 85 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