2012-08-22 13 views
5

मैं बड़ी मात्रा में डेटा से निपट रहा हूं जिसमें मूल्य और समय दोनों (तारों में) हैं।पाइथन में 24 घंटे से अधिक समय के मूल्यों से कैसे निपटें?

मैं निम्नलिखित कोड के साथ दिनांक मूल्यों में स्ट्रिंग समय मान परिवर्तित कर रहा हूँ: 24:: 00: 00,004

time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 

समस्या सिर्फ मेरी डेटा के कुछ प्रारूप होता है। ValueError: समय डेटा '24: 00: 00: 004' प्रारूप '% एच मेल नहीं खाती:% M:% S
तो डेटा के कुछ वास्तव में 24 घंटे से अधिक

अजगर मुझे इस त्रुटि दे रहा है है। % च '

कि इस समस्या

उत्तर

8

%H पैरामीटर केवल रेंज 0-23 में मान पार्स कर सकते हैं के साथ सौदा करने पर कोई भी विचार। आप मैन्युअल रूप से उन विशिष्ट समय टिकटों के साथ सौदा करना होगा:

try: 
    time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 
except ValueError: 
    time = time.replace(' 24', ' 23') 
    time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 
    time += datetime.timedelta(hours=1) 
+0

यह भाग्यशाली है कि यहां 'घंटे' का उपयोग करके कुछ बदसूरत समाधान के बजाय 'प्रतिस्थापन' के उपयोग की अनुमति देने के लिए घंटों के सामने एक जगह थी। – mgilson

+2

@ मिगिलसन: किस मामले में मैंने '23' + समय [2:] 'का उपयोग किया होगा, शायद इसके बजाय' time.startswith ('24') 'के साथ संयुक्त हो। –

+1

'.replace()' में 'गिनती' पैरामीटर भी है। आकस्मिक माध्यमिक प्रतिस्थापन से बचने के लिए मैं अक्सर इसका उपयोग करता हूं। नो-स्पेस केस के लिए, शायद यह भी काम कर सकता है। – DSM

2

घंटे अलग से पार्स करने का प्रयास करें:

hours, rest = time.split(':', 1) 
time = datetime.timedelta(hours=int(hours)) + datetime.datetime.strptime(rest, "%M:%S.%f") 
+0

@ जेएफ। सेबेस्टियन धन्यवाद, तय। – ecatmur

1

लगता है अपने डेटा की तरह दिनांक शामिल नहीं है, लेकिन इन समयावधियों है, तो आप शायद चाहिए datetime के बजाय अपने डेटा को timedelta के रूप में स्टोर करें।


आप this फ़ंक्शन का उपयोग timedelta अपने तार से बनाने के लिए कर सकते हैं: इस

>>>t = parseTimeDelta('24:00:00.04')

की तरह अपने समय स्ट्रिंग '24:00:00.004' पार्स एक timedelta में प्रतिनिधित्व में परिणाम होगा

import re 
from datetime import timedelta 

def parseTimeDelta(s): 
    d = re.match(
      r'((?P<days>\d+) days,)?(?P<hours>\d+):' 
      r'(?P<minutes>\d+):(?P<seconds>\d+)\.(?P<milliseconds>\d+)', 
      str(s)).groupdict(0) 
    return timedelta(**dict(((key, int(value)) 
           for key, value in d.items()))) 

इस

की तरह

>>> print t
1 day, 0:00:00.004000

+0

'% f' microseconds से मेल खाता है, मिलीसेकंड नहीं। 'Str()' अनावश्यक रूप से कॉल न करें। – jfs

संबंधित मुद्दे