पायथन में गैर-शून्य गद्देदार टाइमस्टैम्प को पार्स करना


84

मैं टाइमस्टैम्प से निम्नलिखित की तरह डेटासेट प्राप्त करना चाहता हूं: 3/1/2014 9:55साथ datetime.strptimeया कुछ समान।

महीने, महीने का दिन, और घंटे शून्य गद्देदार नहीं है, लेकिन यहां एक प्रारूपण निर्देश सूचीबद्ध नहीं लगता है जो स्वचालित रूप से पार्स करने में सक्षम है।

ऐसा करने के लिए सबसे अच्छा तरीका क्या है? धन्यवाद!

जवाबों:


131

strptimeगैर-गद्देदार मूल्यों को पार्स करने में सक्षम है। तथ्य यह है कि उन्हें स्वरूपण कोड तालिका में गद्देदार होने के रूप में नोट किया जाता है, strftimeआउटपुट पर लागू होता है । तो आप बस उपयोग कर सकते हैं

datetime.strptime(datestr, "%m/%d/%Y %H:%M")

8

strptimeisdo को 0-गद्देदार मान की आवश्यकता नहीं है। नीचे उदाहरण देखें

datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output:   datetime.datetime(2014, 3, 1, 9, 55)

2

बस अगर यह उत्तर किसी और की मदद करता है - मैं सोच रहा था कि मुझे शून्य गद्दी के साथ समस्या थी, लेकिन यह वास्तव में 12:00 बनाम 00:00 और %Iफ़ॉर्मेटर के साथ करना था ।

%Iफ़ॉर्मेटर 12 घंटे घड़ी घंटे से मिलान करने, वैकल्पिक रूप से शून्य गद्देदार लिए है। लेकिन आपके डेटा स्रोत के आधार पर, आपको डेटा मिल सकता है जो कहता है कि आधी रात या दोपहर वास्तव में शून्य है, उदाहरण के लिए:

>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'

जो strptimeवास्तव में चाहता था वह 12 था, शून्य नहीं:

>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)

लेकिन हम हमेशा अपने डेटा स्रोतों को नियंत्रित नहीं करते हैं! इस किनारे के मामले के लिए मेरा समाधान अपवाद को पकड़ने के लिए था, इसे एक के साथ पार्स करने की कोशिश करें %H, एक त्वरित जांच के साथ कि हम किनारे के मामले में हैं जो हमें लगता है कि हम अंदर हैं।

def get_datetime(string):
    try:
        timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
    except ValueError:
        # someone used zero for midnight?
        timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
        assert string.lower().endswith('am')
        assert timestamp.hour == 0
    return timestamp

0:12amअमान्य इनपुट है। यह होना चाहिए 12:12am11:59 pmइसके बाद है 12:00 am, नहीं 0:00am। गलत समय प्रारूप में डेटा की आपूर्ति करने के विभिन्न तरीके हो सकते हैं। उदाहरण के लिए, इनपुट %yचार अंकों के वर्ष ( %Y) या दिन / महीने के बजाय दो अंकों वाले वर्ष ( ) का उपयोग किया जा सकता है ( %m/%dबनाम %d/%m), आदि दिन / महीने का मामला अस्पष्ट हो सकता है जैसे, 2015/10/12क्या यह "12 अक्टूबर" या "10 दिसंबर" है? btw, आपको इनपुट प्रारूप से मेल खाने के %Y/%m/%dबजाय उपयोग करना चाहिए %m/%d/%Y
12

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

2

आप स्ट्रैटेम दस्तावेज़ को यहाँ देख सकते हैं see लेकिन वास्तव में वे सभी प्लेटफार्मों में अच्छी तरह से काम नहीं कर रहे हैं , उदाहरण के लिए ,7 %-d,%-mपर काम नहीं करते हैं अजगर 2.7 द्वारा , ताकि आप इस तरह से पूरा कर सकें

>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())  
>>> print(date_str)
2016-5-23

1
देशी विंडोज में, हैश को डैश के लिए प्रतिस्थापित किया जाता है: %#d, %#m। लेकिन डैश और हैश मॉड दोनों की आवश्यकता केवल स्ट्रिंग फॉर्मेटिंग ( strftime) में है, पार्सिंग ( strptime) में नहीं ।
नूनो आंद्रे

1

गैर-पैटर्न तरीका dateutil.parseमॉड्यूल का उपयोग करता है, यह सामान्य दिनांक स्वरूपों को पार्स करने की सुविधा देता है, भले ही आपको यह पता न हो कि यह वर्तमान में क्या उपयोग कर रहा है।
Ex:

>>> import dateutil.parser
>>> 
>>> utc_time     = '2014-08-13T00:00:00'
>>> verbose_time = '13-Aug-2014'
>>> some_locale  = '3/1/2014 9:55'
>>> dateutil.parser.parse(utc_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(verbose_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(some_locale)
datetime.datetime(2014, 3, 1, 9, 55)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.