2013-08-13 37 views
41

Tôi đang sử dụng gấu trúc/python và tôi có hai chuỗi thời gian ngày s1 và s2, đã được tạo bằng hàm 'to_datetime' trên trường của df chứa ngày/giờ.trích xuất ngày từ giá trị numpy.timedelta64

Khi tôi trừ s1 từ s2

s3 = s2 - s1

tôi nhận được một loạt, s3, loại

timedelta64 [ns]

0 385 days, 04:10:36 
1  57 days, 22:54:00 
2 642 days, 21:15:23 
3 615 days, 00:55:44 
4 160 days, 22:13:35 
5 196 days, 23:06:49 
6  23 days, 22:57:17 
7  2 days, 22:17:31 
8 622 days, 01:29:25 
9  79 days, 20:15:14 
10 23 days, 22:46:51 
11 268 days, 19:23:04 
12     NaT 
13     NaT 
14 583 days, 03:40:39 

Làm thế nào để nhìn vào 1 phần tử của loạt bài:

s3 [10]

tôi nhận được một cái gì đó như thế này:

numpy.timedelta64 (2069211000000000, 'ns')

Làm cách nào để trích xuất các ngày từ s3 và có thể giữ chúng dưới dạng số nguyên (không quá quan tâm đến giờ/phút, v.v ...)?

Cảm ơn trước vì đã được trợ giúp.

+3

chỉ FYI, sắp sáp nhập vào gấu trúc làm chủ functionaility này: https://github.com/pydata/pandas/pull/4534 (bạn có thể làm điều này trên 0.12 và trước đó bởi: '' s.apply (lambda x: x/np.timedelta64 (1, 'D')) '' – Jeff

Trả lời

76

Bạn có thể chuyển đổi nó thành một timedelta có độ chính xác trong ngày. Để trích xuất giá trị số nguyên của các ngày bạn chia nó với một timedelta của một ngày.

>>> x = np.timedelta64(2069211000000000, 'ns') 
>>> days = x.astype('timedelta64[D]') 
>>> days/np.timedelta64(1, 'D') 
23 

Hoặc, như @PhillipCloud đề nghị, chỉ days.astype(int) kể từ khi timedelta chỉ là một số nguyên 64bit được giải thích theo nhiều cách khác nhau tùy thuộc vào tham số thứ hai bạn thông qua vào ('D', 'ns', ...).

Bạn có thể tìm hiểu thêm về nó here.

+13

Bạn cũng có thể thực hiện 'days.item(). days' hoặc' days .astype (int) ' –

+1

phiên bản mới hơn của gấu trúc hỗ trợ một loại Timedelta chính thức, xem tài liệu ở đây: http://pandas.pydata.org/pandas-docs/stable/timedeltas.html – Jeff

+0

Đây là một ứng cử viên tốt cho Bạn có thể làm điều này trong cùng một dòng nơi bạn tính giá trị cột bằng cách đặt .apply (lambda x: x/np.timedelta64 (1, 'D')) ở cuối để áp dụng chuyển đổi ở cấp cột. ví dụ. s3 = (s1-s2) .apply (lambda x: x/np.timedelta64 (1, 'D')). –

4

Giả sử bạn có một loạt timedelta:

import pandas as pd 
from datetime import datetime 
z = pd.DataFrame({'a':[datetime.strptime('20150101', '%Y%m%d')],'b':[datetime.strptime('20140601', '%Y%m%d')]}) 

td_series = (z['a'] - z['b']) 

Một cách để chuyển đổi cột timedelta này hay một loạt là để bỏ nó vào một đối tượng Timedelta (gấu trúc 0.15.0+) và sau đó trích xuất các ngày từ đối tượng :

td_series.astype(pd.Timedelta).apply(lambda l: l.days) 

một cách khác là để cast loạt như một timedelta64 trong ngày, và sau đó đúc nó như một int:

td_series.astype('timedelta64[D]').astype(int) 
15

Sử dụng dt.days để lấy thuộc tính ngày làm số nguyên.

Đối với ví dụ:

In [14]: s = pd.Series(pd.timedelta_range(start='1 days', end='12 days', freq='3000T')) 

In [15]: s 
Out[15]: 
0 1 days 00:00:00 
1 3 days 02:00:00 
2 5 days 04:00:00 
3 7 days 06:00:00 
4 9 days 08:00:00 
5 11 days 10:00:00 
dtype: timedelta64[ns] 

In [16]: s.dt.days 
Out[16]: 
0  1 
1  3 
2  5 
3  7 
4  9 
5 11 
dtype: int64 

Tổng quát hơn - Bạn có thể sử dụng .components tài sản để truy cập vào một hình thức giảm timedelta.

In [17]: s.dt.components 
Out[17]: 
    days hours minutes seconds milliseconds microseconds nanoseconds 
0  1  0  0  0    0    0   0 
1  3  2  0  0    0    0   0 
2  5  4  0  0    0    0   0 
3  7  6  0  0    0    0   0 
4  9  8  0  0    0    0   0 
5 11  10  0  0    0    0   0 

Bây giờ, để có được những hours thuộc tính:

In [23]: s.dt.components.hours 
Out[23]: 
0  0 
1  2 
2  4 
3  6 
4  8 
5 10 
Name: hours, dtype: int64 
Các vấn đề liên quan