दिलचस्प पोस्ट
उद्देश्य-सी में फ्लोट की तुलना करने वाली अजीब समस्या यूनिट टेस्टिंग डेटाबेस-चालित अनुप्रयोगों के लिए सबसे अच्छी रणनीति क्या है? एक अनंत सूची की परिमित समझ पायथन में टाइप एनोटेशन के स्व-संदर्भ यदि कोई डेटटाइम रेंज एक और ओवरलैप करता है तो मैं SQL सर्वर में कैसे निर्धारित कर सकता हूं एक जावास्क्रिप्ट ऑब्जेक्ट में संपत्ति के मूल्य के लिए श्रोता परिवर्तन कैसे अप्रबंधित DLL को .net ऐप से कॉलबैक इंटरफ़ेस को कार्यान्वित करें? पायथन: ISO-8859-1 / latin1 से UTF-8 में परिवर्तित कैसे चेक किया जाए कि दिए गए सी ++ स्ट्रिंग या चार * केवल अंक हैं? सभी से इनकार करते हैं, केवल एक आईपी को htaccess के द्वारा अनुमति दें जावा में वैश्विक चर ढेर पर बनाई गई वस्तु को रोकने के लिए कैसे? टी-एसक्यूएल दशमलव भाग सटीकता डबल बफरिंग जब OnPaint में ड्राइंग न हो तो: यह काम क्यों नहीं करता? SQLite ने 14 का एक त्रुटि कोड लौटाया

Datetime.isocalendar () के व्युत्क्रम को खोजने का सबसे अच्छा तरीका क्या है?

दिए गए (ISO_year, ISO_week_number, ISO_weekday) ऑब्जेक्ट के लिए (ISO_year, ISO_week_number, ISO_weekday) datetime.isocalendar() मेथड एक ट्यूपल (ISO_year, ISO_week_number, ISO_weekday) देता है। क्या कोई समान व्युत्क्रम कार्य है? यदि नहीं, तो एक वर्ष, सप्ताह का नंबर और सप्ताह का दिन दी गई तारीख की गणना करने का एक आसान तरीका है?

Solutions Collecting From Web of "Datetime.isocalendar () के व्युत्क्रम को खोजने का सबसे अच्छा तरीका क्या है?"

मुझे हाल ही में इस समस्या को हल करना पड़ा, और इस समाधान के साथ आया:

 import datetime def iso_year_start(iso_year): "The gregorian calendar date of the first day of the given ISO year" fourth_jan = datetime.date(iso_year, 1, 4) delta = datetime.timedelta(fourth_jan.isoweekday()-1) return fourth_jan - delta def iso_to_gregorian(iso_year, iso_week, iso_day): "Gregorian calendar date for the given ISO year, week and day" year_start = iso_year_start(iso_year) return year_start + datetime.timedelta(days=iso_day-1, weeks=iso_week-1) 

कुछ परीक्षण मामलों:

 >>> iso = datetime.date(2005, 1, 1).isocalendar() >>> iso (2004, 53, 6) >>> iso_to_gregorian(*iso) datetime.date(2005, 1, 1) >>> iso = datetime.date(2010, 1, 4).isocalendar() >>> iso (2010, 1, 1) >>> iso_to_gregorian(*iso) datetime.date(2010, 1, 4) >>> iso = datetime.date(2010, 1, 3).isocalendar() >>> iso (2009, 53, 7) >>> iso_to_gregorian(*iso) datetime.date(2010, 1, 3) 
 import datetime def iso_to_gregorian(iso_year, iso_week, iso_day): "Gregorian calendar date for the given ISO year, week and day" fourth_jan = datetime.date(iso_year, 1, 4) _, fourth_jan_week, fourth_jan_day = fourth_jan.isocalendar() return fourth_jan + datetime.timedelta(days=iso_day-fourth_jan_day, weeks=iso_week-fourth_jan_week) 

यह @ बेन जाम्स के बहुत अच्छे उत्तर से अनुकूलित किया गया था आपको वर्ष के पहले दिन को जानने की जरूरत नहीं है। आपको बस उस तारीख का उदाहरण जानना होगा जो निश्चित रूप से एक ही आईएसओ वर्ष में है, और उस तारीख के आईएसओ कैलेंडर सप्ताह और दिन।

जनवरी का 4 जनवरी केवल एक उदाहरण है, क्योंकि, जैसा कि बेन ने बताया, जनवरी के 4 वें हमेशा एक ही आईएसओ वर्ष और ग्रेगोरी वर्ष के हैं, और ऐसा करने के लिए वर्ष का पहला दिन है।

चूंकि हफ़्ते सभी समान लंबाई हैं, आप बस उस दिन की आईएसओ, जिसकी आप दोनों रूपों में जानते हैं, और उस दिन के दिनों और हफ्तों में जोड़ सकते हैं, उस दिन की आईएसओ और दिनों के बीच बस घटा सकते हैं। (यह कोई फर्क नहीं पड़ता कि ये नंबर सकारात्मक या नकारात्मक हैं, इसलिए आप कुछ और 'तयशुदा दिन' चुन सकते हैं जैसे कि 28 दिसंबर।)

संपादित करें

मैंने इसे सही किया क्योंकि, जैसा कि जॉयो द्वारा मददगार रूप से इंगित किया गया था, ग्रेगोरीयन वर्ष का पहला दिन जो आईएसओ वर्ष का भी है, जनवरी 4 जनवरी 5 जनवरी नहीं है। जैसा कि स्पष्टीकरण कहते हैं, कोई फर्क नहीं पड़ता कि तिथि को संदर्भ बिंदु के रूप में चुना जाता है, लेकिन 4 जनवरी को चुनने से यह विकल्प कम 'जादू' होता है।

पायथन 3.6 (वर्तमान में विकास में ) के रूप में, आप नए %G , %u और %V निर्देशों का उपयोग कर सकते हैं। देखें 12006 और अद्यतन दस्तावेज़ :

%G
आईएसओ 8601 साल सदी के साथ साल का प्रतिनिधित्व करता है जिसमें आईएसओ सप्ताह ( %V ) का अधिक हिस्सा होता है।

%u
आईएसओ 8601 सप्ताह के दिन एक दशमलव संख्या के रूप में जहां 1 सोमवार है।

%V
सप्ताह के पहले दिन के रूप में सोमवार के साथ एक दशमलव संख्या के रूप में आईएसओ 8601 सप्ताह। सप्ताह 01 सप्ताह में 4 जनवरी है।

वर्ष, सप्ताहनंबर और सप्ताह के दिनों की संख्या के साथ एक स्ट्रिंग को देखते हुए, ये उन तारीखों को पार्स करना आसान है:

 from datetime import date date.strptime('2002 01 1', '%G %V %u') 

या पूर्णांक इनपुट के साथ एक समारोह के रूप में:

 from datetime import date def date_from_isoweek(iso_year, iso_weeknumber, iso_weekday): return date.strptime( '{:04d} {:02d} {:d}'.format(iso_year, iso_weeknumber, iso_weekday) '%G %V %u') 

आने वाले लोगों के लिए, एक छोटे, एक-डीईएफ़, बेन के अच्छे समाधान का संस्करण:

 def iso_to_gregorian(iso_year, iso_week, iso_day): jan4 = datetime.date(iso_year, 1, 4) start = jan4 - datetime.timedelta(days=jan4.isoweekday()-1) return start + datetime.timedelta(weeks=iso_week-1, days=iso_day-1) 

पायथन 3.6 में शुरू, datetime.strptime() %G , %V और %u निर्देशों का समर्थन करेगा, ताकि आप केवल datetime.strptime('2015 1 2', '%G %V %u').date() देखें: https://hg.python.org/cpython/rev/acdebfbfbdcf

ध्यान दें कि% W सप्ताह # (0-53) है जो आईएसओ सप्ताह (1-53) के समान नहीं है। ऐसे बढ़ते मामले होंगे जहां% डब्ल्यू काम नहीं करेगा।

संपादित करें: इस पर ध्यान न दें, किनारे के मामलों में दर्द होता है। बेन के समाधान के साथ जाओ

ठीक है, करीब निरीक्षण पर मैंने देखा कि strptime में %W और %w पैरामीटर हैं, इसलिए निम्न कार्य करता है:

 def fromisocalendar(y,w,d): return datetime.strptime( "%04dW%02d-%d"%(y,w-1,d), "%YW%W-%w") 

कुछ मिलते हैं: आईएसओ सप्ताह का नंबर 1 पर शुरू होता है, जबकि %W 0 से शुरू होता है। आईएसओ सप्ताह का दिन 1 (सोमवार) से शुरू होता है, जो कि %w के समान है, इसलिए रविवार को संभवत: 0 , 7 नहीं हो सकता है …