2016-04-12 17 views
5

Tôi muốn tính toán độ lệch thời gian giữa lần trong một DateTimeIndextính toán chênh lệch thời gian của DateTimeIndex

import pandas as pd 
p = pd.DatetimeIndex(['1985-11-14', '1985-11-28', '1985-12-14', '1985-12-28'], dtype='datetime64[ns]') 

tôi có thể tính toán độ lệch thời gian của hai lần:

p[1] - p[0] 

cho

Timedelta('14 days 00:00:00') 

Nhưng p [1:] - p [: - 1] không hoạt động và cung cấp

DatetimeIndex(['1985-12-28'], dtype='datetime64[ns]', freq=None) 

và cảnh báo trong tương lai:

FutureWarning: using '-' to provide set differences with datetimelike Indexes is deprecated, use .difference() 

Bất kỳ suy nghĩ về cách làm thế nào tôi có thể (dễ dàng) tính toán độ lệch thời gian giữa các giá trị trong một DateTimeIndex? Và tại sao nó làm việc cho 1 giá trị, nhưng không phải cho toàn bộ DateTimeIndex?

Trả lời

4

Chuyển đổi DatetimeIndex đến một Series sử dụng to_series() và sau đó gọi diff để tính toán sự khác biệt giữa các hàng:

In [5]: 
p.to_series().diff() 

Out[5]: 
1985-11-14  NaT 
1985-11-28 14 days 
1985-12-14 16 days 
1985-12-28 14 days 
dtype: timedelta64[ns] 

Tại sao nó không thành công, toán tử - ở đây đang cố gắng thực hiện một sự khác biệt hoặc giao điểm của các phạm vi chỉ mục khác nhau của bạn, bạn đang cố trừ các giá trị từ một phạm vi này sang một phạm vi khác mà diff thực hiện.

khi bạn đã làm p[1]-p[0] các - đang thực hiện một phép trừ vô hướng nhưng khi bạn làm điều này trên một chỉ số nó nghĩ rằng bạn đang thực hiện một hoạt động thiết lập

+0

Tôi nghĩ rằng đây là câu trả lời đầy đủ và các giải pháp đơn giản nhất. Cảm ơn tất cả sự giúp đỡ của bạn. –

0

Nhà điều hành - đang hoạt động, nó không làm những gì bạn mong đợi. Trong trường hợp thứ hai, nó hoạt động để đưa ra sự khác biệt của hai chỉ số ngày giờ, đó là giá trị trong p[1:] nhưng không phải trong p[:-1]

Có thể có giải pháp tốt hơn, nhưng nó sẽ hoạt động để thực hiện yếu tố hoạt động khôn ngoan :

[e - k for e,k in zip(p[1:], p[:-1])] 
0

tôi đã sử dụng None để điền giá trị khác biệt đầu tiên, nhưng Tôi chắc rằng bạn có thể tìm ra cách bạn muốn đối phó với trường hợp đó.

>>> [None] + [p[n] - p[n-1] for n in range(1, len(p))] 
[None, 
Timedelta('14 days 00:00:00'), 
Timedelta('16 days 00:00:00'), 
Timedelta('14 days 00:00:00')] 

BTW, để chỉ nhận được sự khác biệt trong ngày:

[None] + [(p[n] - p[n-1]).days for n in range(1, len(p))] 
[None, 14, 16, 14] 
Các vấn đề liên quan