सप्ताह संख्या से दिनांक प्राप्त करें


91

कृपया मेरे कोड में क्या गलत है:

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)

"2013-01-01 00:00:00" प्रदर्शित करें, धन्यवाद।

जवाबों:


182

एक तारीख बनाने के लिए एक सप्ताह की संख्या पर्याप्त नहीं है; आपको सप्ताह के एक दिन की भी आवश्यकता है। एक डिफ़ॉल्ट जोड़ें:

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)

-1और -%wपैटर्न पार्सर कि सप्ताह में सोमवार लेने के लिए कहता है। यह आउटपुट:

2013-07-01 00:00:00

%Wसप्ताह के पहले दिन के रूप में सोमवार का उपयोग करता है। जब आप अपना कार्यदिवस चुन सकते हैं, तो आपको अप्रत्याशित परिणाम मिल सकते हैं यदि आप इससे विचलित होते हैं।

प्रलेखन, फुटनोट 4 में व्यवहार strftime()और strptime()व्यवहार अनुभाग देखें :

जब strptime()विधि के साथ उपयोग किया जाता है , %Uऔर %Wकेवल सप्ताह के दिन और वर्ष निर्दिष्ट किए जाने पर गणना में उपयोग किया जाता है।

ध्यान दें, यदि आपका सप्ताह नंबर एक आईएसओ सप्ताह की तारीख है , तो आप %G-W%V-%uइसके बजाय उपयोग करना चाहते हैं ! उन निर्देशों में अजगर 3.6 या नए की आवश्यकता होती है।


2
काम नहीं करता। datetime.datetime.strptime ("2018-W0-0", "% YW% W-% w") == datetime.datetime.strptime ("2018-W1-0", "% YW% W-% w") -> "2018-01-07 00:00:00"। 2018 के पहले और दूसरे सप्ताह में एक ही शुरुआत तिथि है।
ozw1z5rd

2
@ ozw1z5rd: ऐसा इसलिए है क्योंकि 2018 में कोई सप्ताह नहीं है। सप्ताह 0 पहले वर्ष के पहले सोमवार से पहले आंशिक सप्ताह है; 2018 में पहला सोमवार 1 जनवरी को है। दूसरे शब्दों में, आपके इनपुट स्ट्रिंग में यहां समस्या है, तकनीक नहीं है और पाइथन की जगह W1 का अर्थ करने के लिए W0 की व्याख्या करने के लिए त्रुटि-सही है।
मार्टिन पीटर्स

@ ozw1z5rd: यदि यह आपके ऐप के लिए एक समस्या है, तो आपको ऐसे वर्षों में विशेष-केस की आवश्यकता होगी; if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
मार्टिन पीटर्स

किसी भी विचार कैसे गैर शून्य गद्देदार सप्ताह की संख्या से निपटने के लिए? (उदा। 2020-w1, 2020-w52)
माइकल एच।

@MichaelH: मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं।
मार्टिन पीटर्स

30

अन्य उत्तरों को पूरा करने के लिए - यदि आप आईएसओ सप्ताह संख्याओं का उपयोग कर रहे हैं , तो यह स्ट्रिंग उपयुक्त है (किसी दिए गए आईएसओ सप्ताह संख्या के सोमवार प्राप्त करने के लिए):

import datetime
d = '2013-W26'
r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
print(r)

%G, %V, %uके आईएसओ समकक्ष हैं %Y, %W, %w, तो यह आउटपुट:

2013-06-24 00:00:00

पायथन में एवलाबे 3.6+; से डॉक्स


14

पायथन 3.8 में वहाँ काम है datetime.date.fromisocalendar:

>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1)  # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)

पुराने पायथन संस्करणों (3.7-) में गणना इस बात का उपयोग कर सकती है कि datetime.date.isocalendarकिस सप्ताह से आईएसओ8601 अनुपालन सप्ताह का पता लगाया जा सकता है:

from datetime import date, timedelta

def monday_of_calenderweek(year, week):
    first = date(year, 1, 1)
    base = 1 if first.isocalendar()[1] == 1 else 8
    return first + timedelta(days=base - first.isocalendar()[2] + 7 * (week - 1))

दोनों साथ काम भी करते हैं datetime.datetime


7
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res

सप्ताह के दिन के रूप में 1 जोड़ने से वर्तमान सप्ताह की शुरुआत होगी। समयसीमा (दिन = 6) जोड़ने से आपको सप्ताह समाप्त हो जाएगा।

datetime.datetime(2018, 7, 23)

@ सेंथिकुमार सी जो नीचे की तरह होना चाहिएres = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
एमडी अलाउद्दीन अल-अमीन

स्वीकृत उत्तर में 2021-01-04 तारीख के साथ एक समस्या है, यह कहता है कि यह वर्ष 2020 तक है
ignacio.munizaga

1

यदि आपके पास सप्ताह की वार्षिक संख्या है, तो सप्ताह के पहले सप्ताह को वर्ष के पहले दिन में जोड़ें।

>>> import datetime
>>> from dateutil.relativedelta import relativedelta

>>> week = 40
>>> year = 2019
>>> date = datetime.date(year,1,1)+relativedelta(weeks=+week)
>>> date
datetime.date(2019, 10, 8)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.