2015-12-24 23 views
6

Tôi cảm thấy như thế này nên được thực hiện rất dễ dàng, nhưng tôi không thể tìm ra cách. Tôi có một pandasDataFrame với cột ngày:Ngày để Độ bền ở Pandas

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] 

Tôi muốn có một cột của khoảng thời gian, một cái gì đó như:

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

sản lượng nỗ lực của tôi bó 0 ngày và NaT thay vì:

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

Bất kỳ ý tưởng nào?

Trả lời

4

Bạn có thể sử dụng 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 có ích ở đây: (see docs)

Bắt đầu từ năm v0.15.0, chúng tôi giới thiệu một loại vô hướng mới Timedelta, mà là một lớp con của datetime.timedelta, và cư xử một cách tương tự, nhưng cho phép khả năng tương thích với Các loại np.timedelta64 cũng như một loạt các biểu diễn, phân tích cú pháp và các thuộc tính tùy chỉnh.

Timedeltas là sự khác biệt về thời gian, được biểu thị bằng các đơn vị khác nhau, ví dụ: ngày, giờ, phút, giây. Chúng có thể vừa dương và âm.

df 

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

Bạn có thể:

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 

Ngoài ra, bạn có thể tính toán sự khác biệt giữa các điểm trong thời gian sử dụng .shift() (hoặc .diff() được minh họa bằng @Andy Hayden):

res = df-df.shift() 

để nhận được:

res.fillna(0) 

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

Bạn có thể chuyển đổi các từ timedelta64dtype-integer sử dụng:

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

0  0 
1 180 
2  1 
3  13 
4  1 
2

df.date[1:] - df.date[:-1] không làm những gì bạn nghĩ rằng nó. Mỗi phần tử được trừ bởi ánh xạ chỉ mục chuỗi/dataframe, chứ không phải theo vị trí trong chuỗi.

Tính df.date[1:] - df.date[:-1] làm:

+---- 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 
Các vấn đề liên quan