2010-07-22 4 views
101

मेरे पास आईपीडीडम्प का उपयोग करके बनाए गए ब्लैकबेरी आईपीडी बैकअप से सीएसवी डंपफाइल है।पायथन स्ट्रिपटाइम() और टाइमज़ोन?

Tue Jun 22 07:46:22 EST 2010 

मैं अजगर में इस तिथि को पार्स करने में सक्षम होना चाहिए: दिनांक/समय यहाँ में तार इस की तरह कुछ (जहां EST एक ऑस्ट्रेलियाई समय-क्षेत्र की है) देखो। सबसे पहले, मैंने डेटाटाइम से strptime() फ़ंक्शन का उपयोग करने का प्रयास किया।

>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z') 

हालांकि, किसी कारण से, datetime उद्देश्य यह है कि वापस आता है किसी भी tzinfo संबद्ध होना प्रतीत नहीं होता है।

मैं this page कि जाहिरा तौर पर datetime.strptime चुपचाप छोड़ देता है tzinfo, तथापि, मैं प्रलेखन जाँच पर पढ़ा है और क्या मुझे लगता है कि प्रभाव here दस्तावेज के लिए कुछ भी नहीं मिल रहा।

मैं तीसरे पक्ष के पायथन पुस्तकालय, dateutil का उपयोग करके पार्स किया गया दिनांक प्राप्त करने में सक्षम हूं, हालांकि मैं अभी भी उत्सुक हूं कि मैं अंतर्निहित strptime() गलत तरीके से कैसे उपयोग कर रहा था? क्या टाइमज़ोन के साथ अच्छी तरह से खेलने के लिए strptime() प्राप्त करने का कोई तरीका है?

+1

क्या आप बस ... सभी तिथियों को जीएमटी में परिवर्तित नहीं कर सकते? – Robus

+1

@ रोबस: हम्म, मैं ऐसा करने की उम्मीद कर रहा था - लेकिन मुझे लगता है कि बार-बार/डेटाटाइम ऐसा कर सकता है?किसी भी तरह से, मुझे इस तथ्य को स्टोर/पर्स करने की ज़रूरत है कि डेटाटाइम ईएसटी टाइमज़ोन में हैं, या जो भी समय वे मेरे साथ होते हैं। स्क्रिप्ट को टाइमज़ोन जानकारी के साथ जेनेरिक डेटाटाइम को पार्स करने में सक्षम होना चाहिए (उदा। ईटीसी कोई अन्य टाइमज़ोन हो सकता है)। – victorhooi

+3

ईएसटी भी एक यूएस टाइमज़ोन संक्षेप है। (इसी तरह बीएसटी एक यूके और ब्राजीलियाई टाइमज़ोन abbrev दोनों है।) इस तरह के संक्षेप केवल स्वाभाविक रूप से संदिग्ध हैं। इसके बजाय यूटीसी/जीएमटी के सापेक्ष ऑफसेट का उपयोग करें। (यदि आपको संक्षेप में समर्थन करने की आवश्यकता है, तो आपको मैपिंग लोकेल-आश्रित बनाने की आवश्यकता है और यह एक गन्दा चूहा-छेद है।) –

उत्तर

26

datetime module documentation का कहना है:

Return a datetime corresponding to date_string, parsed according to format. This is equivalent to datetime(*(time.strptime(date_string, format)[0:6])) .

कि [0:6] देखते हैं? यह आपको (year, month, day, hour, minute, second) प्राप्त करता है। और कुछ नहीं। टाइमज़ोन का कोई उल्लेख नहीं है।

दिलचस्प बात यह है कि, [Win XP SP2, Python 2.6, 2.7] time.strptime पर अपना उदाहरण गुजरना काम नहीं करता है, लेकिन यदि आप "% Z" और "EST" को बंद करते हैं तो यह काम करता है। "ईएसटी" कार्यों के बजाय "यूटीसी" या "जीएमटी" का भी उपयोग करना। "पीएसटी" और "एमईजेड" काम नहीं करते हैं। पेचीदा।

+2

संबंधित पायथन बग: [% Z में strptime ईएसटी और अन्य से मेल नहीं खाता] (http://bugs.python.org/issue22377) – jfs

276

मैं python-dateutil का उपयोग करने की सलाह देता हूं। इसका पार्सर अब तक हर तारीख प्रारूप को पार्स करने में सक्षम रहा है।

>>> from dateutil import parser 
>>> parser.parse("Tue Jun 22 07:46:22 EST 2010") 
datetime.datetime(2010, 6, 22, 7, 46, 22, tzinfo=tzlocal()) 
>>> parser.parse("Fri, 11 Nov 2011 03:18:09 -0400") 
datetime.datetime(2011, 11, 11, 3, 18, 9, tzinfo=tzoffset(None, -14400)) 
>>> parser.parse("Sun") 
datetime.datetime(2011, 12, 18, 0, 0) 
>>> parser.parse("10-11-08") 
datetime.datetime(2008, 10, 11, 0, 0) 

और इसी तरह। strptime() प्रारूप बकवास के साथ कोई व्यवहार नहीं ... बस उस पर एक तारीख फेंक दें और यह सही बात है।

अद्यतन: ओह। मुझे आपके मूल प्रश्न में याद आया कि आपने उल्लेख किया है कि आपने dateutil का उपयोग किया था, इसके बारे में खेद है। लेकिन मुझे उम्मीद है कि यह उत्तर अभी भी उन लोगों के लिए उपयोगी है जो इस प्रश्न पर ठोकर खाते हैं जब उनके पास तारीखों को पार्स करने की तारीख होती है और उस मॉड्यूल की उपयोगिता दिखाई देती है।

+5

इस अविश्वसनीय कक्षा के लिए एक लाख और एक अपवर्त। साझा करने के लिए धन्यवाद। –

+1

+1 यह उत्तर वास्तव में उपयोगी साबित हुआ है! धन्यवाद :-) – nemesisdesign

+0

यह देखते हुए कि बहुत से लोग पाइथन-डेटुटिल का उपयोग करते हैं, मैं हमें उस lib की एक सीमा को इंगित करना चाहता हूं। '>>> parser.parse (" गुरू, 25 सितं, 2003 10: 49: 41,123 -0300 ") Traceback (सबसे हाल कॉल पिछले): फ़ाइल" ", लाइन 1, फ़ाइल में"/उपयोगकर्ताओं/wanghq /awscli/lib/python2.7/site-packages/dateutil/parser.py ", लाइन 748, पार्स में वापसी DEFAULTPARSER.parse (timestr, ** kwargs) फ़ाइल"/उपयोगकर्ता/wanghq/awscli/lib/python2 .7/साइट-पैकेज/डेट्यूटिल/पार्सर.py ", लाइन 310, पार्स रेस में, skipped_tokens = self._parse (timestr, ** kwargs) टाइप एरर: 'noneType' ऑब्जेक्ट इज़ेबल नहीं है – wanghq

6

आपकी टाइम स्ट्रिंग rfc 2822 (date format in email, http headers) में समय प्रारूप के समान है। आप केवल stdlib का उपयोग कर इसे पार्स सकता है:

>>> from email.utils import parsedate_tz 
>>> parsedate_tz('Tue Jun 22 07:46:22 EST 2010') 
(2010, 6, 22, 7, 46, 22, 0, 1, -1, -18000) 

समाधान है कि विभिन्न अजगर संस्करणों के लिए समय क्षेत्र अवगत datetime वस्तुओं उपज देखें: parsing date with timezone from an email

इस प्रारूप में, EST is semantically equivalent to -0500। हालांकि, सामान्य रूप से, a timezone abbreviation is not enough, to identify a timezone uniquely