trích xuất ngày từ giá trị numpy.timedelta64


87

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

Khi tôi trừ s1 khỏi 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 cách nào để xem 1 phần tử của chuỗ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 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 sự giúp đỡ nào.


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

Câu trả lời:


146

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

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

Hoặc, như @PhillipCloud gợi ý, chỉ days.astype(int)kể từ khi timedeltachỉ 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 thêm về nó ở đây .


16
Bạn cũng có thể làm days.item().dayshoặc days.astype(int).
Phillip Cloud

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

Đây là một ứng cử viên tốt cho .apply. Bạn có thể thực hiện việc này trong cùng một dòng nơi bạn tính toán các 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')).
Ezekiel Kruglick

2
Phương pháp này astype('timedelta64[D]')(khoảng 96ms) hiệu quả hơn nhiều so với dt.days.(khoảng 24 giây) cho 4.000.000 hàng.
Pengju Zhao,

37

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

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 thuộc .componentstính để truy cập một dạng rút gọn của 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ờ, để lấy hoursthuộ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

+1 - Đây là cách tốt nhất để thực hiện việc này hiện tại vì gói gấu trúc đã tiến triển kể từ khi câu hỏi này được hỏi.
Austin A

7

Giả sử bạn có một chuỗi hẹn giờ:

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 hoặc chuỗi thời gian này là truyền nó sang đối tượng Timedelta (pandas 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à truyền chuỗi dưới dạng định thời gian 64 trong ngày, sau đó truyền nó dưới dạng int:

td_series.astype('timedelta64[D]').astype(int)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.