পাইথন স্ট্র্যাপটাইম () এবং টাইমজোনগুলি?


157

আইপিডিডাম্প ব্যবহার করে একটি ব্ল্যাকবেরি আইপিডি ব্যাকআপ থেকে আমার একটি সিএসভি ডাম্পফাইল রয়েছে। এখানে তারিখ / সময়ের স্ট্রিংগুলির মতো দেখতে কিছুটা (যেখানে ESTঅস্ট্রেলিয়ার সময় অঞ্চল):

Tue Jun 22 07:46:22 EST 2010

পাইথনে এই তারিখটি বিশ্লেষণ করতে আমার সক্ষম হওয়া দরকার। প্রথমে, strptime()ডেটটাইম থেকে ফাংশনটি ব্যবহার করার চেষ্টা করেছি।

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

যাইহোক, কিছু কারণে, datetimeযে জিনিসটি ফিরে আসে তা এর tzinfoসাথে কোনও যুক্ত বলে মনে হয় না ।

আমি এই পৃষ্ঠায় পড়েছি যা স্পষ্টতই datetime.strptimeনিঃশব্দে বাতিল করে দেয় tzinfo, তবে, আমি নথিটি যাচাই করেছিলাম এবং এখানে ডকুমেন্টেড সেই প্রভাবটির কিছুই খুঁজে পাচ্ছি না ।

আমি তৃতীয় পক্ষের পাইথন লাইব্রেরি, ডেটুটিল ব্যবহার করে তারিখটি বিশ্লেষণ করতে সক্ষম হয়েছি , তবে আমি কীভাবে অন্তর্নির্মিতটি strptime()ভুলভাবে ব্যবহার করছিলাম তা সম্পর্কে এখনও আগ্রহী ? strptime()টাইমজোনগুলির সাথে সুন্দরভাবে খেলতে যাওয়ার কোনও উপায় আছে কি ?


1
আপনি কি পারবেন না ... সমস্ত তারিখ GMT তে রূপান্তর করতে পারেন?
রবাস

2
@ রবস: হুম, আমি এটি করার আশা করছিলাম - তবে আমি ধরেই নিয়েছিলাম যে স্ট্রাইফটাইম / ডেটটাইম কোনওভাবে এটি করতে পারে? যে কোনও উপায়ে, আমার এই তারিখের সময়গুলি EST টাইমজোনে রয়েছে বা আমার সাথে যা কিছু টাইমজোন হয় তা সংরক্ষণ / পার্স করা দরকার। স্ক্রিপ্টটি টাইমজোন তথ্য (যেমন ইটিসি অন্য কোনও টাইমজোন হতে পারে) দিয়ে জেনেরিক ডেটটাইমগুলি পার্স করতে সক্ষম হওয়া দরকার।
ভিক্টোহোই

3
EST হ'ল একটি মার্কিন সময় অঞ্চল সংক্ষেপণ viation (একইভাবে বিএসটি হ'ল যুক্তরাজ্য এবং ব্রাজিলের টাইমজোন সংক্ষেপ)। এই জাতীয় সংক্ষিপ্ত বিবরণগুলি কেবল সহজাতভাবে অস্পষ্ট। পরিবর্তে ইউটিসি / জিএমটির তুলনায় অফসেটগুলি ব্যবহার করুন। (যদি আপনাকে সংক্ষেপণগুলি সমর্থন করার প্রয়োজন হয় তবে আপনাকে ম্যাপিং লোকেল-নির্ভর করতে হবে এবং এটি একটি অদৃশ্য ইঁদুর-গর্ত))
ডোনাল ফেলো

উত্তর:


58

datetimeমডিউল ডকুমেন্টেশন বলেছেন:

ফর্ম্যাট অনুসারে পার্স করা ডেট_স্ট্রিংয়ের সাথে সম্পর্কিত একটি ডেটটাইম ফেরান। এটি সমান datetime(*(time.strptime(date_string, format)[0:6]))

দেখেন তো [0:6]? যে আপনি পায় (year, month, day, hour, minute, second)। আর কিছু না. টাইমজোনগুলির উল্লেখ নেই।

মজার বিষয় হচ্ছে, [উইন এক্সপি এসপি 2, পাইথন ২.6, ২.7] আপনার উদাহরণটি time.strptimeকাজ করে না তবে আপনি যদি "% জেড" এবং "ইএসটি" কে সরিয়ে দেন এটি কার্যকর হয়। এছাড়াও "ইসটি" এর পরিবর্তে "ইউটিসি" বা "জিএমটি" ব্যবহার করে। "পিএসটি" এবং "এমইজেড" কাজ করে না। বিরক্তিকর।

এটি লক্ষণীয় যে এটি সংস্করণ 3.2 হিসাবে আপডেট করা হয়েছে এবং একই নথি এখন নিম্নলিখিতগুলিও বলেছে:

যখন% z নির্দেশিকাটি স্ট্রপটাইম () পদ্ধতিতে সরবরাহ করা হয় তখন একটি সচেতন ডেটটাইম অবজেক্ট তৈরি করা হবে। ফলাফলের tzinfo একটি সময় অঞ্চল উদাহরণে সেট করা হবে।

নোট করুন যে এটি% Z এর সাথে কাজ করে না, তাই কেসটি গুরুত্বপূর্ণ। নিম্নলিখিত উদাহরণটি দেখুন:

In [1]: from datetime import datetime

In [2]: start_time = datetime.strptime('2018-04-18-17-04-30-AEST','%Y-%m-%d-%H-%M-%S-%Z')

In [3]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: None

In [4]: start_time = datetime.strptime('2018-04-18-17-04-30-+1000','%Y-%m-%d-%H-%M-%S-%z')

In [5]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: UTC+10:00


353

আমি পাইথন-ডেটুটিল ব্যবহার করার পরামর্শ দিই । এর পার্সারটি আমি এ পর্যন্ত ফেলে দেওয়া প্রতিটি তারিখের ফর্ম্যাটটি পার্স করতে সক্ষম হয়েছি।

>>> 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, সে সম্পর্কে দুঃখিত। তবে আমি আশা করি যে উত্তরটি এখনও অন্য লোকেদের পক্ষে দরকারী যারা এই তারিখটি বিশদ করার প্রশ্নে তারিখ বিশ্লেষণ করে এবং সেই মডিউলটির ইউটিলিটি দেখেন।


বহু লোক পাইথন-ডেটুটিল ব্যবহারের ঝোঁক দেখায়, আমি আমাদের এই লিবাটির একটি সীমাবদ্ধতা নির্দেশ করতে চাই। >>> parser.parse("Thu, 25 Sep 2003 10:49:41,123 -0300") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 748, in parse return DEFAULTPARSER.parse(timestr, **kwargs) File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 310, in parse res, skipped_tokens = self._parse(timestr, **kwargs) TypeError: 'NoneType' object is not iterable
Wanghq

1
@wanghq আপনাকে পিরিয়ড সহ শেষ কমা প্রতিস্থাপন করতে হবে। তারপরেparser.parse("Thu, 25 Sep 2003 10:49:41.123 -0300") returns: datetime.datetime(2003, 9, 25, 10, 49, 41, 123000, tzinfo=tzoffset(None, -10800))
ফ্লাইংফক্সলি

7
@ ফ্লাইংফক্সলি, হ্যাঁ, আমি এটি বুঝতে পারি। আমি কেবল লোকগুলিকে পাইথন-ডেটুটিলের সীমাবদ্ধতা বলতে চাই। এটি যাদু জিনিসগুলি করে, তবে কখনও কখনও এটি করতে ব্যর্থ হয়। সুতরাং "এটিতে কেবল একটি তারিখ নিক্ষেপ করুন এবং এটি সঠিক জিনিস করে।" 100% সত্য নয়।
Wanghq

4
dateutil.parser.parse("10-27-2016 09:06 AM PDT")প্রত্যাবর্তন: datetime.datetime(2016, 10, 27, 9, 6)সময় অঞ্চল নির্ধারণে ব্যর্থ ...
হ্যাপসন্তান

2
এটি কারও লক্ষ্যের উপর নির্ভর করে। dateutil parserব্যবহার সহজ হতে পারে, তবে strptime()দ্রুত। তদতিরিক্ত, এর ফর্ম্যাটগুলি শিখতে বেশ সহজ quite
rapture

9

আপনার সময়ের স্ট্রিংটি আরএফসি 2822 (ইমেলের তারিখের ফর্ম্যাট, HTTP শিরোনাম) এর সময়ের বিন্যাসের মতো । আপনি কেবল স্টডলিব ব্যবহার করে এটি পার্স করতে পারেন:

>>> 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)

বিভিন্ন পাইথন সংস্করণগুলির জন্য টাইমজোন-সচেতন ডেটটাইম অবজেক্টগুলি পাওয়া যায় এমন সমাধানগুলি দেখুন: একটি ইমেল থেকে টাইমজোন সহ তারিখ পার্সিং

এই বিন্যাসে, ESTশব্দার্থগত সমতুল্য-0500 । যদিও, সাধারণত, একটি টাইমজোন সংক্ষেপণ যথেষ্ট নয়, একটি টাইমজোনকে স্বতন্ত্রভাবে সনাক্ত করতে


0

এই সঠিক সমস্যার মধ্যে দৌড়ে।

আমি যা করে শেষ করেছি:

# starting with date string
sdt = "20190901"
std_format = '%Y%m%d'

# create naive datetime object
from datetime import datetime
dt = datetime.strptime(sdt, sdt_format)

# extract the relevant date time items
dt_formatters = ['%Y','%m','%d']
dt_vals = tuple(map(lambda formatter: int(datetime.strftime(dt,formatter)), dt_formatters))

# set timezone
import pendulum
tz = pendulum.timezone('utc')

dt_tz = datetime(*dt_vals,tzinfo=tz)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.