2013-04-19 40 views
13

Tôi có một khung dữ liệu trong gấu trúc được gọi là 'munged_data' với hai cột 'entry_date' và 'dob' mà tôi đã chuyển đổi thành Dấu thời gian bằng cách sử dụng pd.to_timestamp.I đang cố gắng tìm hiểu cách tính tuổi của mọi người dựa trên sự khác biệt thời gian giữa 'entry_date' và 'dob' và để làm điều này tôi cần để có được sự khác biệt trong ngày giữa hai cột (để tôi sau đó có thể làm somehting như tròn (ngày/365,25). . có thể tìm thấy một cách để làm điều này bằng cách sử dụng hoạt động vectorized Khi tôi làm munged_data.entry_date-munged_data.dob tôi nhận được như sau:Pandas Timedelta trong Ngày

internal_quote_id 
2     15685977 days, 23:54:30.457856 
3     11651985 days, 23:49:15.359744 
4      9491988 days, 23:39:55.621376 
7      11907004 days, 0:10:30.196224 
9     15282164 days, 23:30:30.196224 
15     15282227 days, 23:50:40.261632 

Tuy nhiên tôi dường như không có khả năng trích xuất những ngày như một số nguyên để tôi có thể tiếp tục tính toán của mình. Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

10

Bạn cần 0.11 cho điều này (0.11rc1 là ra, prob thức vào tuần tới)

In [9]: df = DataFrame([ Timestamp('20010101'), Timestamp('20040601') ]) 

In [10]: df 
Out[10]: 
        0 
0 2001-01-01 00:00:00 
1 2004-06-01 00:00:00 

In [11]: df = DataFrame([ Timestamp('20010101'), 
          Timestamp('20040601') ],columns=['age']) 

In [12]: df 
Out[12]: 
        age 
0 2001-01-01 00:00:00 
1 2004-06-01 00:00:00 

In [13]: df['today'] = Timestamp('20130419') 

In [14]: df['diff'] = df['today']-df['age'] 

In [16]: df['years'] = df['diff'].apply(lambda x: float(x.item().days)/365) 

In [17]: df 
Out[17]: 
        age    today    diff  years 
0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00 12.304110 
1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00 8.887671 

Bạn cần lẻ này được áp dụng ở cuối vì chưa đầy đủ hỗ trợ cho timedelta64 [ns] vô hướng (ví dụ như thế nào chúng tôi sử dụng Dấu thời gian ngay bây giờ cho datetime64 [ns], đến trong 0,12)

+0

Cảm ơn Jeff rất hữu ích tôi không biết abou phương thức item(). Tôi đã làm được điều đó với 0.10 – luckyfool

+0

tuyệt vời! Dưới đây là một số công thức và liên kết đến tài liệu mới (trong 0,11), http://pandas.pydata.org/pandas-docs/dev/cookbook.html#miscellaneous – Jeff

10

Không chắc chắn nếu bạn vẫn cần, nhưng trong Pandas 0,14 tôi thường sử dụng phương thức .pepe ('timedelta64 [X]') http://pandas.pydata.org/pandas-docs/stable/timeseries.html (chuyển đổi tần số)

df = pd.DataFrame([ pd.Timestamp('20010101'), pd.Timestamp('20040605') ]) 
df.ix[0]-df.ix[1] 

Returns:

0 -1251 days 
dtype: timedelta64[ns] 
(df.ix[0]-df.ix[1]).astype('timedelta64[Y]') 

Returns:

0 -4 
dtype: float64 

Hy vọng rằng sẽ giúp

+1

Điều này hiệu quả. Tôi chuyển sang 'D' cho' Y' để có ngày. – fantabolous

+0

Tôi chỉ googled và tìm thấy câu hỏi này. Vấn đề của tôi là tôi đã sử dụng một cái gì đó tương tự như Jeff trả lời cho dataframe của tôi. Tuy nhiên, tôi có như một triệu dòng, do đó, áp dụng là loại chậm. Sử dụng '.astype ('timedelta64 [D]')' là một phương thức nhanh hơn (khoảng 200x) –

21

Sử dụng loại Timedelta sẵn các Pandas từ v0.15.0 bạn cũng có thể làm :

In[1]: import pandas as pd 
In[2]: df = pd.DataFrame([ pd.Timestamp('20150111'), 
          pd.Timestamp('20150301') ], columns=['date']) 
In[3]: df['today'] = pd.Timestamp('20150315') 
In[4]: df 
Out[4]: 
     date  today 
0 2015-01-11 2015-03-15 
1 2015-03-01 2015-03-15 

In[5]: (df['today'] - df['date']).dt.days 
Out[5]: 
0 63 
1 14 
dtype: int64 
4

Để chuyển đổi bất kỳ loại dữ liệu vào ngày chỉ cần sử dụng Timedelta() ngày:.

pd.Timedelta(1985, unit='Y').days 
84494 
5

Hãy xác định rằng bạn có một loạt gấu trúc tên time_difference mà có kiểu numpy.timedelta64 [ns]

Một cách để giải nén chỉ trong ngày (hoặc bất kỳ thuộc tính mong muốn) như sau:

just_day = time_difference.apply(lambda x: pd.tslib.Timedelta(x).days) 

Chức năng này được sử dụng vì đối tượng numpy.timedelta64 không có thuộc tính 'days'.