2014-10-20 18 views
15

में पेंडस डेटाफ्रेम कॉलम duration में दिखाए गए अनुसार timedelta64[ns] में timedelta64 [ns] कॉलम को सेकंड में कनवर्ट करें। आप उन्हें सेकंड में कैसे परिवर्तित कर सकते हैं?पाइथन पांडस डेटाफ्रेम

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] 

मैं निम्नलिखित

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

कोशिश की, लेकिन त्रुटि

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 

इसके अलावा

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

की कोशिश की हो गई लेकिन त्रुटि प्राप्त

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

इस निश्चित हाल में जारी है, जैसा कि [स्रोत कोड] में है (https://github.com/pydata/pandas/blame/778cfe43a4cef52442e00fe505290079a717f515/pandas/core/ops.py#L304), यदि दोनों पक्ष timedelta अतिरिक्त हैं, घटाव और _division_ समर्थित हैं। कोड का वह अनुभाग 2013 –

+0

@ behzad.nouri में वापस बदला गया था, मुझे विश्वास है कि यह 0.13.1 (शायद 0.14 की आवश्यकता है) में तय किया गया था, लेकिन वर्तमान 0.15.0 है: http://pandas.pydata.org /pandas-docs/stable/timedeltas.html#frequency-conversion – Jeff

+0

@ behzad.nouri धन्यवाद, पांडस 0.15.0 और numpy 1.9.0 को अद्यतन करने के लिए यह काम करने के लिए मिला। – Nyxynyx

उत्तर

28

इस पांडा के वर्तमान संस्करण में ठीक से काम करता (संस्करण 0.14): datetime64 डेटा

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

timedelta64 और:

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 

यहाँ पांडा/NumPy के पुराने संस्करणों के लिए एक समाधान नहीं है 8-बाइट इनट्स के रूप में आंतरिक रूप से संग्रहीत हैं (dtype '<i8')। तो उपर्युक्त timedelta64s को 8-बाइट इंट्स के रूप में देखता है और फिर पूर्णांक विभाजन को नैनोसेकंड को सेकेंड में परिवर्तित करने के लिए करता है।

ध्यान दें कि आप need NumPy version 1.7 or newer डेटाटाइम 64/timedelta64s के साथ काम करने के लिए नोट करते हैं।

5

बस महसूस किया कि यह एक पुराने धागा है, वैसे इसे यहाँ छोड़ रहा है, तो वांडरर्स मेरे जैसे केवल शीर्ष 5 परिणाम खोज इंजन पर पर क्लिक करता है और यहाँ समाप्त होता है।

सुनिश्चित करें कि आपके प्रकार सही हैं।

  • आप datetimeसेकंड कन्वर्ट करने के लिए, बस अगर इसकी अवधि के लिए भीतर एक तारीख datetime वस्तु के प्रत्येक घंटा, मिनट के लिए सेकंड और सेकंड योग चाहते हैं।

      • घंटे - घंटे एक्स 3600 = सेकंड
      • मिनट - मिनट x 60 = सेकंड
      • सेकंड - सेकंड

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

  • आप timedelta कन्वर्ट करने के लिएसेकंड एक bellow का उपयोग करें।

    start_dt और END_DT कॉलम इस प्रारूप में हैं:

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

मैं इसे इस तरह काम करने के लिए मिल गया

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] 

timedelta64 में मेरी अवधि था [एनएस] प्रारूप है, जो और अंत डेटाटाइम मानों का घटाव था।

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

परिणामस्वरूप अवधि स्तंभ में इस

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] 

का उपयोग करते हुए पांडा मैं नाव में दो दिनांकों के बीच मेरी अवधि सेकंड था की तरह लग रहे। बाद में अपनी अवधि की तुलना या फ़िल्टर करने के लिए आसान है।

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 

मेरे मामले में यदि मैं सभी अवधि प्राप्त करना चाहता हूं जो 1 सेकंड से अधिक है।

उम्मीद है कि यह मदद करता है।

0

हम बस पांडा लागू() समारोह का उपयोग कर सकते

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) 
संबंधित मुद्दे