2014-10-20 42 views
15

Cột gấu trúc Cột DataFrame duration chứa timedelta64[ns] như được hiển thị. Làm thế nào bạn có thể chuyển đổi chúng thành giây?Chuyển đổi cột timedelta64 [ns] thành giây trong Python Pandas DataFrame

0 00:20:32 
1 00:23:10 
2 00:24:55 
3 00:13:17 
4 00:18:52 
Name: duration, dtype: timedelta64[ns] 

Tôi đã thử các sau

print df[:5]['duration']/np.timedelta64(1, 's') 

nhưng đã nhận lỗi

Traceback (most recent call last): 
    File "test.py", line 16, in <module> 
    print df[0:5]['duration']/np.timedelta64(1, 's') 
    File "C:\Python27\lib\site-packages\pandas\core\series.py", line 130, in wrapper 
    "addition and subtraction, but the operator [%s] was passed" % name) 
TypeError: can only operate on a timedeltas for addition and subtraction, but the operator [__div__] was passed 

Cũng cố gắng

print df[:5]['duration'].astype('timedelta64[s]') 

nhưng đã nhận lỗi

Traceback (most recent call last): 
    File "test.py", line 17, in <module> 
    print df[:5]['duration'].astype('timedelta64[s]') 
    File "C:\Python27\lib\site-packages\pandas\core\series.py", line 934, in astype 
    values = com._astype_nansafe(self.values, dtype) 
    File "C:\Python27\lib\site-packages\pandas\core\common.py", line 1653, in _astype_nansafe 
    raise TypeError("cannot astype a timedelta from [%s] to [%s]" % (arr.dtype,dtype)) 
TypeError: cannot astype a timedelta from [timedelta64[ns]] to [timedelta64[s]] 
+0

đây là phiên bản cố định gần đây; như trong [mã nguồn] (https://github.com/pydata/pandas/blame/778cfe43a4cef52442e00fe505290079a717f515/pandas/core/ops.py#L304), nếu cả hai bên đều được bổ sung, trừ, và _division_ theo thời gian. phần đó của mã đã được thay đổi trở lại vào năm 2013 –

+0

@ behzad.nouri là đúng, tôi tin rằng điều này đã được sửa trong> 0.13.1 (có thể cần 0.14), nhưng hiện tại là 0.15.0: http://pandas.pydata.org /pandas-docs/stable/timedeltas.html#frequency-conversion – Jeff

+0

@ behzad.nouri Xin cảm ơn, cập nhật lên Pandas 0.15.0 và vâng lời 1.9.0 khiến nó hoạt động. – Nyxynyx

Trả lời

28

này hoạt động đúng trong phiên bản hiện tại của gấu trúc (phiên bản 0.14):

In [132]: df[:5]['duration']/np.timedelta64(1, 's') 
Out[132]: 
0 1232 
1 1390 
2 1495 
3  797 
4 1132 
Name: duration, dtype: float64 

Dưới đây là một cách giải quyết cho các phiên bản cũ của Pandas/NumPy:

In [131]: df[:5]['duration'].values.view('<i8')/10**9 
Out[131]: array([1232, 1390, 1495, 797, 1132], dtype=int64) 

timedelta64 và datetime64 dữ liệu được lưu trữ nội bộ dưới dạng inte 8 byte (dtype '<i8'). Vì vậy, trên xem các timedelta64s là 8-byte ints và sau đó làm số nguyên chia để chuyển đổi nano giây thành giây.

Lưu ý rằng bạn need NumPy version 1.7 or newer để hoạt động với datetime64/timedelta64s.

5

Chỉ cần nhận ra đó là một chủ đề cũ, dù sao rời khỏi nó đây nếu lang thang như tôi nhấp chuột duy nhất trên top 5 kết quả trên công cụ tìm kiếm và kết thúc lên đây.

Đảm bảo rằng loại của bạn là chính xác.

  • Nếu bạn muốn chuyển đổi datetime để giây, chỉ cần tổng hợp giây cho mỗi giờ, phút và giây của đối tượng datetime nếu nó cho thời gian trong vòng một ngày.

      • giờ - giờ x 3600 = giây
      • phút - phút x 60 = giây
      • giây - giây

linear_df['duration'].dt.hour*3600 + linear_df['duration'].dt.minute*60 + linear_df['duration'].dt.second

  • Nếu bạn muốn chuyển đổi timedelta để giây sử dụng một trong những dưới đây.

linear_df[:5]['duration'].astype('timedelta64[s]')

tôi đã nhận nó làm việc như thế này:

start_dt và END_DT cột là ở định dạng này:

import datetime 

linear_df[:5]['start_dt'] 

0 1970-02-22 21:32:48.000 
1 2016-12-30 17:47:33.216 
2 2016-12-31 09:33:27.931 
3 2016-12-31 09:52:53.486 
4 2016-12-31 10:29:44.611 
Name: start_dt, dtype: datetime64[ns] 

Đã thời gian của tôi trong timedelta64 [ns] định dạng, trong đó được trừ của bắt đầukết thúc giá trị ngày giờ.

linear_df['duration'] = linear_df['end_dt'] - linear_df['start_dt'] 

Dẫn cột thời gian giống như thế này

linear_df[:5]['duration'] 

0   0 days 00:00:14 
1 2 days 17:44:50.558000 
2 0 days 15:37:28.418000 
3 0 days 18:45:45.727000 
4 0 days 19:21:27.159000 
Name: duration, dtype: timedelta64[ns] 

Sử dụng gấu trúc tôi đã thời gian giây tôi giữa hai thời điểm trong phao. Dễ dàng hơn để so sánh hoặc lọc thời lượng của bạn sau đó.

linear_df[:5]['duration'].astype('timedelta64[s]') 

0  14.0 
1 236690.0 
2  56248.0 
3  67545.0 
4  69687.0 
Name: duration, dtype: float64 

Trong trường hợp của tôi nếu tôi muốn nhận được tất cả thời lượng hơn 1 giây.

Hy vọng điều đó sẽ hữu ích.

0

Chúng ta có thể chỉ cần sử dụng gấu trúc apply() chức năng

def get_seconds(time_delta): 
    return time_delta.seconds 

def get_microseconds(time_delta): 
    return time_delta.micro_seconds 

time_delta_series = df['duration'] 

converted_series = time_delta_series.apply(get_seconds) 
print(converted_series) 
Các vấn đề liên quan