दिलचस्प पोस्ट
स्थानीय HTML फ़ाइल को WebView में लोड करें क्या sizeof (enum) == आकार (int), हमेशा? एंड्रॉइड में प्रोग्रामेटिक रूप से स्क्रीन चमक स्क्रीन बदल रहा है मोंगो डीबी में, आप अपने इंडेक्स से सरणी तत्व कैसे निकाल सकते हैं Is_constexpr संभवतः सी ++ 11 में है? PHP में सत्र का समय समाप्त करने के लिए कैसे करें? NTFS (Windows XP और Windows Vista) में अधिकतम फ़ाइल नाम की लंबाई? फोर्स आर को घातीय अंकन (जैसे ई + 10) का उपयोग नहीं करने के लिए? MySQL जहां क्वेरी क्वेरी डालें इंटरफ़ेस बिल्डर में गलत रंग जावास्क्रिप्ट में एकल उद्धरण और दोहरे उद्धरणों के बीच का अंतर उपयोगकर्ता पासवर्ड नमक के लिए इष्टतम लंबाई क्या है? सीएसएस में इनलाइन एसवीजी Android में गतिविधियों के बीच तार पास करना Promise.all () नामक निम्नलिखित क्यों नहीं भेजा गया है, जहां Promise.all () में दिए गए सरणी में Promise.reject () शामिल हैं?

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) देता है। क्या कोई समान व्युत्क्रम कार्य है? यदि नहीं, तो एक वर्ष, सप्ताह का नंबर और सप्ताह का दिन दी गई तारीख की गणना करने का एक आसान तरीका है?

वेब के समाधान से एकत्रित समाधान "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 नहीं हो सकता है …