पायथन में सप्ताह संख्या कैसे प्राप्त करें?


339

यह जानने के लिए कि पायथन के साथ 16 जून (wk24) को वर्तमान सप्ताह क्या है?


1
@ डोनल: एक 16 जून को दिखता है, दूसरा 26 जून को।
अंतरजाल

5
सप्ताह को परिभाषित करें 1. समद्विबाहु () ऐसा करने का एकमात्र तरीका नहीं है।
मार्क टॉलेनन

3
ध्यान दें कि उत्पादन से strftime("%U", d)भिन्न हो सकता है isocalendar()। उदाहरण के लिए यदि आप वर्ष को 2004 में बदलते हैं तो आपको सप्ताह का उपयोग करते हुए 24 strftime()और सप्ताह के 25 सप्ताह का समय मिलेगा isocalendar()
मूओइप जूल

जवाबों:


409

datetime.dateएक isocalendar()विधि है, जो कैलेंडर सप्ताह में एक टपल लौटाता है:

>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24

datetime.date.isocalendar () एक उदाहरण-विधि है जिसमें दिए गए तिथि उदाहरण के लिए संबंधित क्रम में वर्ष, सप्ताह और सप्ताह के दिनों में एक टपल लौटाया जाता है।


7
यदि आप ' [1]' की व्याख्या करते हैं, तो यह मदद करेगा या जानकारी के लिए देखने के लिए एक पॉइंटर दिया जाएगा।
जोनाथन लेफ़लर 15

5
मुझे लगता है कि सबसे आसान है स्ट्रैटेम का उपयोग करके सप्ताह की संख्या निकालना, सबसे अच्छा आयात डेटाइम आज = ​​डेटाइम.वन () सप्ताह = आज। स्ट्रैटफ़ाइम ("% W")
बीप्स

7
यह थोड़ी देर की बात है। लेकिन मेरी मशीन पर, date(2010, 1, 1).isocalendar()[1]रिटर्न 53। डॉक्स से: "उदाहरण के लिए, 2004 गुरुवार से शुरू होता है, इसलिए आईएसओ वर्ष 2004 का पहला सप्ताह सोमवार 29 दिसंबर 2003 को शुरू होता है और रविवार 4 जनवरी 2004 को समाप्त होता है, इसलिए वह date(2003, 12, 29).isocalendar() == (2004, 1, 1)और date(2004, 1, 4).isocalendar() == (2004, 1, 7)।"
जुलैन्सी

17
isocalendar()महान है, लेकिन सुनिश्चित करें कि यह वही है जो आप चाहते हैं। आज एक आदर्श उदाहरण है। 01/01/2016 के बराबर है (2015, 53, 5)now.strftime("%W")और now.strftime("%U")बराबर हैं 00जो अक्सर वही होता है जो वह चाहता है। STRFTIME उदाहरण
डेव्ल 17

अच्छा एक, मैंने अभी दिन जोड़ा, मुझे लगता है कि यह मददगार होगा, यह वही था जिसके लिए मैं
सेर्च कर

124

आप स्ट्रिंग के रूप में डेटाटाइम से सीधे सप्ताह संख्या प्राप्त कर सकते हैं।

>>> import datetime
>>> datetime.date(2010, 6, 16).strftime("%V")
'24'

इसके अलावा, आप वर्ष के सप्ताह संख्या के विभिन्न "प्रकार" के लिए strftimeपैरामीटर बदल सकते हैं :

%U- वर्ष की सप्ताह संख्या (सप्ताह के पहले दिन रविवार) शून्य गद्देदार दशमलव संख्या के रूप में। एक नए साल में सभी दिन पहले रविवार से पहले सप्ताह में माना जाता है 0. उदाहरण: 00 , 01,…, 53

%W- वर्ष की सप्ताह संख्या (सप्ताह के पहले दिन सोमवार ) दशमलव संख्या के रूप में। एक नए साल में सभी दिन पहले सोमवार से पहले सप्ताह में माना जाता है 0. उदाहरण: 00 , 01,…, 53

[...]

( पायथन 3.6 में जोड़ा गया, कुछ वितरण के पायथॉन 2.7 का समर्थन किया गया ) C89 मानक द्वारा अपेक्षित कई अतिरिक्त निर्देशों को सुविधा के लिए शामिल नहीं किया गया है। ये सभी पैरामीटर आईएसओ 8601 तिथि मानों के अनुरूप हैं। ये सभी प्लेटफ़ॉर्म पर उपलब्ध नहीं हो सकते हैं जब strftime()विधि के साथ उपयोग किया जाता है ।

[...]

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

से: डेटाइम - मूल तिथि और समय प्रकार - पायथन 3.7.3 प्रलेखन

मुझे इसके बारे में यहाँ से पता चला है । इसने मेरे लिए पायथन 2.7.6 में काम किया


क्या आप उद्धृत कर रहे हैं, कुछ लिनक्स मैनुअल? पायथन 2.7.5 और 3.3.2 Invalid format stringइस पैटर्न को कहते हैं । उनके डॉक्स का उल्लेख %Vनहीं है।
वेसेवोलॉड गोलोवानोव

3
क्षमा करें, मैंने इसका उल्लेख नहीं किया है, मैं यहां से मिला हूं । इसने मेरे लिए पायथन 2.7.6 में काम किया।
जोताकोर

2
बहुत बढ़िया जवाब! मैं जोड़ना चाहूंगा कि यदि आप अपनी तिथियों के प्रतिनिधित्व के लिए '<YEAR> - <ISOWEEK>' में रुचि रखते हैं, तो %G-%Vइसके बजाय का उपयोग करें %Y-%V%GISO वर्ष के बराबर है%Y
KenHBS

मुझे काम करने के लिए इसे इस तरह लिखना था: datetime.datetime (2010, 6, 16)। ("% V")
एविनर

77

मुझे विश्वास date.isocalendar()है कि इसका उत्तर होगा। यह लेख आईएसओ 8601 कैलेंडर के पीछे के गणित की व्याख्या करता है। पाइथन डॉक्यूमेंटेशन के डेटाइमटाइम पेज के डेट.इस्कैलेंडर () हिस्से को देखें ।

>>> dt = datetime.date(2010, 6, 16) 
>>> wk = dt.isocalendar()[1]
24

.isocalendar () वर्ष (wk संख्या, wk दिन) के साथ एक 3-tuple लौटाएं। dt.isocalendar()[0]वर्ष dt.isocalendar()[1]लौटाता है, सप्ताह संख्या dt.isocalendar()[2]देता है, सप्ताह का दिन लौटाता है। जैसा सरल हो सकता है।


4
लिंक के लिए +1 जो आईएसओ सप्ताह के गैर-सहज स्वभाव की व्याख्या करता है।
मार्क रैनसम

27

यहाँ एक और विकल्प है:

import time
from time import gmtime, strftime
d = time.strptime("16 Jun 2010", "%d %b %Y")
print(strftime("%U", d))

जो प्रिंट करता है 24

देखें: http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior


9
या% W अगर आपका सप्ताह सोमवार से शुरू होता है।
जीवरन सेप

1
यह दृष्टिकोण उन मामलों में बेहतर है जहां आप एक तारीख के रूप में विभाजित या परिवर्तित नहीं करना चाहते हैं जो एक स्ट्रिंग के रूप में आता है ... बस स्ट्रिंग को स्ट्रिंग प्रारूप में स्ट्रिंग के रूप में पास करें और प्रारूप को दूसरे तर्क में निर्दिष्ट करें। अच्छा समाधान। याद रखें: सोमवार को सप्ताह शुरू होने पर% W।
TheCuriousOne

22

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

यदि आप सप्ताह के दिन की परवाह किए बिना सप्ताह में 1 जनवरी को हमेशा 1 जनवरी को एक परिभाषा का उपयोग करते हैं, तो इस तरह से एक व्युत्पन्न का उपयोग करें:

>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24

3
यह कहते हुए कि वर्ष के आरंभ और अंत में समद्विबाहु "कुछ दिलचस्प विसंगतियां" हैं, यह एक समझ का एक सा प्रतीत होता है। 29 दिसंबर, 2014, 00:00:00 जैसे कुछ डेटाटाइम मूल्यों के लिए आइसोकैन्डर के परिणाम बहुत भ्रामक हैं (भले ही आईएसओ विनिर्देशन के तहत वास्तव में गलत नहीं), जो कि आइसोकेन्डर के अनुसार 2015 का एक वर्ष का मूल्य और 1 का एक सप्ताह का मान है (देखें) नीचे मेरा प्रवेश)।
केविन

3
@ केविन, यह गलत नहीं है, यह सिर्फ इतना है कि उनकी परिभाषा आपकी मेल नहीं खाती है। आईएसओ ने दो चीजें तय कीं: पहला यह कि सोमवार से रविवार तक पूरा सप्ताह एक ही साल में होगा, दूसरा यह कि जिस दिन का अधिकांश दिन होता है वह एक दिन होता है। यह वर्ष की शुरुआत और अंत के आसपास सप्ताह के दिनों की ओर जाता है जो निकटवर्ती वर्ष में स्थानांतरित होता है।
मार्क रैनसम

6
माना। लेकिन ज्यादातर लोगों की परिभाषा के अनुसार, 29 दिसंबर 2014 सबसे निश्चित रूप से वर्ष 2015 के सप्ताह 1 नहीं होगा। मैं सिर्फ भ्रम के इस संभावित स्रोत पर ध्यान आकर्षित करना चाहता था।
केविन

यही वह है जिसकी तलाश में मैं हूं। यह कैसे करना है, इसके बारे में नहीं, लेकिन आईएसओ के बारे में जानकारी और सोमवार की बात के साथ शुरू करना।
अमित अमोला

19

आम तौर पर वर्तमान सप्ताह संख्या (रविवार से शुरू) पाने के लिए:

from datetime import *
today = datetime.today()
print today.strftime("%U")

4
स्ट्रैफ़टाइम ('% U') के दस्तावेज़ीकरण से: "वर्ष की सप्ताह संख्या (सप्ताह के पहले दिन रविवार) को दशमलव संख्या के रूप में [00,53]। नए साल में सभी दिन पहले रविवार को माना जाता है। सप्ताह में होने के लिए 0. "
डोलन एंटेनुची

14

वर्ष के तात्कालिक सप्ताह के पूर्णांक मान के लिए प्रयास करें:

import datetime
datetime.datetime.utcnow().isocalendar()[1]

10

वीक नंबरिंग के लिए कई सिस्टम हैं । निम्नलिखित कोड कोड के साथ सबसे आम सिस्टम हैं:

  • आईएसओ : पहले सप्ताह की शुरुआत सोमवार से होती है और इसमें 4 जनवरी होनी चाहिए। आईएसओ कैलेंडर पहले से ही पायथन में लागू है:

    >>> from datetime import date
    >>> date(2014, 12, 29).isocalendar()[:2]
    (2015, 1)
  • उत्तर अमेरिकी : पहला सप्ताह रविवार से शुरू होता है और इसमें पहली जनवरी होनी चाहिए। निम्नलिखित कोड उत्तरी अमेरिकी प्रणाली के लिए पायथन के आईएसओ कैलेंडर कार्यान्वयन का मेरा संशोधित संस्करण है:

    from datetime import date
    
    def week_from_date(date_object):
        date_ordinal = date_object.toordinal()
        year = date_object.year
        week = ((date_ordinal - _week1_start_ordinal(year)) // 7) + 1
        if week >= 52:
            if date_ordinal >= _week1_start_ordinal(year + 1):
                year += 1
                week = 1
        return year, week
    
    def _week1_start_ordinal(year):
        jan1 = date(year, 1, 1)
        jan1_ordinal = jan1.toordinal()
        jan1_weekday = jan1.weekday()
        week1_start_ordinal = jan1_ordinal - ((jan1_weekday + 1) % 7)
        return week1_start_ordinal
    >>> from datetime import date
    >>> week_from_date(date(2014, 12, 29))
    (2015, 1)
  • MMWR (CDC) : पहला सप्ताह रविवार से शुरू होता है और इसमें 4 जनवरी शामिल होना चाहिए। मैंने विशेष रूप से इस नंबरिंग सिस्टम (आईएसओ सिस्टम के लिए समर्थन भी है) के लिए एपिवीक्स पैकेज बनाया । यहाँ एक उदाहरण है:
    >>> from datetime import date
    >>> from epiweeks import Week
    >>> Week.fromdate(date(2014, 12, 29))
    (2014, 53)

8

यदि आप केवल बोर्ड में समद्विबाहु सप्ताह संख्या का उपयोग कर रहे हैं तो निम्नलिखित पर्याप्त होना चाहिए:

import datetime
week = date(year=2014, month=1, day=1).isocalendar()[1]

यह हमारे सप्ताह की संख्या के लिए समद्विबाहु द्वारा लौटे टपल के दूसरे सदस्य को पुनः प्राप्त करता है।

हालाँकि, यदि आप ग्रेगोरियन कैलेंडर में डील करने वाले डेट फ़ंक्शंस का उपयोग करने जा रहे हैं, तो अकेले ही काम नहीं करेगा! निम्नलिखित उदाहरण लें:

import datetime
date = datetime.datetime.strptime("2014-1-1", "%Y-%W-%w")
week = date.isocalendar()[1]

यहाँ तार 2014 में पहले सप्ताह के सोमवार को हमारी तारीख के रूप में लौटाने के लिए कहते हैं। जब हम यहाँ सप्ताह संख्या को पुनः प्राप्त करने के लिए समद्विबाहु का उपयोग करते हैं, तो हम उसी सप्ताह की संख्या वापस पाने की उम्मीद करेंगे, लेकिन हम नहीं करते हैं। इसके बजाय हमें एक सप्ताह की संख्या मिलती है 2. क्यों?

ग्रेगोरियन कैलेंडर में सप्ताह 1 सोमवार से युक्त पहला सप्ताह है। सप्ताह 1 समद्विबाहु में पहला सप्ताह होता है जिसमें गुरुवार होता है। 2014 की शुरुआत में आंशिक सप्ताह में गुरुवार होता है, इसलिए इस सप्ताह 1 को समद्विबाहु द्वारा, और बनाना होता हैdate सप्ताह 2 ।

यदि हम ग्रेगोरियन सप्ताह प्राप्त करना चाहते हैं, तो हमें सम्‍मिलक को ग्रेगोरियन से परिवर्तित करना होगा। यहाँ एक सरल कार्य है जो चाल करता है।

import datetime

def gregorian_week(date):
    # The isocalendar week for this date
    iso_week = date.isocalendar()[1]

    # The baseline Gregorian date for the beginning of our date's year
    base_greg = datetime.datetime.strptime('%d-1-1' % date.year, "%Y-%W-%w")

    # If the isocalendar week for this date is not 1, we need to 
    # decrement the iso_week by 1 to get the Gregorian week number
    return iso_week if base_greg.isocalendar()[1] == 1 else iso_week - 1

6

आप नीचे दिए अनुसार% W निर्देश की कोशिश कर सकते हैं:

d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))

'% W': वर्ष की सप्ताह संख्या (सप्ताह के पहले दिन सोमवार) दशमलव संख्या के रूप में। एक नए साल में सभी दिन पहले सोमवार से पहले सप्ताह में माना जाता है 0. (00, 01, ..., 53)


2

कुछ तिथियों के लिए isocalendar () गलत वर्ष और सप्ताह के मान लौटाता है:

Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime as dt
>>> myDateTime = dt.datetime.strptime("20141229T000000.000Z",'%Y%m%dT%H%M%S.%fZ')
>>> yr,weekNumber,weekDay = myDateTime.isocalendar()
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2015, weekNumber is 1

मार्क रैनसम के दृष्टिकोण के साथ तुलना करें:

>>> yr = myDateTime.year
>>> weekNumber = ((myDateTime - dt.datetime(yr,1,1)).days/7) + 1
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2014, weekNumber is 52

3
Iso8601 कैलेंडर (उदाहरण के लिए, staff.science.uu.nl/~gent0113/calendar/isocalendar.htm ) के बारे में कुछ लिंक को देखते हुए, मैं देखता हूं कि वर्ष और सप्ताह के दौरान मान जो सम्‍मिलित हैं (।) ऐसे के रूप में "गलत" नहीं हैं। उदाहरण के लिए, ISO8601 के तहत, वर्ष 2004 की शुरुआत 29 दिसंबर, 2003 को हुई थी। इसलिए 2015 के वर्ष को वापस करने के लिए Dec.29 2014 के लिए समद्विबाहु () सही हो सकता है, लेकिन बहुत से लोगों के उद्देश्यों के लिए, यह बहुत ही भ्रामक है ।
केविन

2

मैं चर्चा को दो चरणों में संक्षेपित करता हूं:

  1. कच्चे प्रारूप को एक datetimeवस्तु में बदलें ।
  2. सप्ताह की संख्या की गणना करने के लिए किसी datetimeवस्तु या वस्तु के कार्य का उपयोग करें date

जोश में आना

`` `अजगर

from datetime import datetime, date, time
d = date(2005, 7, 14)
t = time(12, 30)
dt = datetime.combine(d, t)
print(dt)

`` `

पहला चरण

किसी datetimeऑब्जेक्ट को मैन्युअल रूप से जनरेट करने के लिए , हम उपयोग datetime.datetime(2017,5,3)या कर सकते हैंdatetime.datetime.now()

लेकिन वास्तव में, हमें आमतौर पर मौजूदा स्ट्रिंग को पार्स करने की आवश्यकता होती है। हम strptimeफ़ंक्शन का उपयोग कर सकते हैं , जैसे कि datetime.strptime('2017-5-3','%Y-%m-%d')आपको प्रारूप को विशिष्ट करना होगा। विभिन्न प्रारूप कोड का विवरण आधिकारिक दस्तावेज में पाया जा सकता है ।

वैकल्पिक रूप से, एक अधिक सुविधाजनक तरीका डेटापार मॉड्यूल का उपयोग करना है। उदाहरण हैं dateparser.parse('16 Jun 2010'), dateparser.parse('12/2/12')याdateparser.parse('2017-5-3')

उपरोक्त दो दृष्टिकोण एक datetimeवस्तु को वापस करेंगे ।

दूसरा चरण

datetimeकॉल करने के लिए प्राप्त वस्तु का उपयोग करें strptime(format)। उदाहरण के लिए,

`` `अजगर

dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object. This day is Sunday
print(dt.strftime("%W")) # '00' Monday as the 1st day of the week. All days in a new year preceding the 1st Monday are considered to be in week 0.
print(dt.strftime("%U")) # '01' Sunday as the 1st day of the week. All days in a new year preceding the 1st Sunday are considered to be in week 0.
print(dt.strftime("%V")) # '52' Monday as the 1st day of the week. Week 01 is the week containing Jan 4.

`` `

यह तय करना बहुत मुश्किल है कि किस प्रारूप का उपयोग करना है। एक बेहतर तरीका यह है dateकि कॉल करने के लिए एक वस्तु प्राप्त करें isocalendar()। उदाहरण के लिए,

`` `अजगर

dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object
d = dt.date() # convert to a date object. equivalent to d = date(2017,1,1), but date.strptime() don't have the parse function
year, week, weekday = d.isocalendar() 
print(year, week, weekday) # (2016,52,7) in the ISO standard

`` `

वास्तव में, आपको date.isocalendar()साप्ताहिक रिपोर्ट तैयार करने के लिए उपयोग करने की अधिक संभावना होगी , विशेष रूप से "क्रिसमस-नव वर्ष" खरीदारी के मौसम में।


0
userInput = input ("Please enter project deadline date (dd/mm/yyyy/): ")

import datetime

currentDate = datetime.datetime.today()

testVar = datetime.datetime.strptime(userInput ,"%d/%b/%Y").date()

remainDays = testVar - currentDate.date()

remainWeeks = (remainDays.days / 7.0) + 1


print ("Please pay attention for deadline of project X in days and weeks are  : " ,(remainDays) , "and" ,(remainWeeks) , "Weeks ,\nSo  hurryup.............!!!") 

-1

बहुत सारे उत्तर दिए गए हैं, लेकिन उन्हें जोड़ना पसंद है।

यदि आपको वर्ष / सप्ताह शैली के रूप में प्रदर्शित करने के लिए सप्ताह की आवश्यकता है (उदाहरण 1953 - 2019 के सप्ताह 53, 2001 - 2020 के सप्ताह 1 आदि), तो आप यह कर सकते हैं:

import datetime

year = datetime.datetime.now()
week_num = datetime.date(year.year, year.month, year.day).strftime("%V")
long_week_num = str(year.year)[0:2] + str(week_num)

यह वर्तमान वर्ष और सप्ताह लेगा, और यह लिखने के दिन long_week_num होगा:

>>> 2006

date()खरोंच से क्यों बना ? datetime.datetime()उदाहरणों में .date()उस कार्य के लिए एक विधि है।
मार्टिन पीटर्स

हालाँकि, अधिक चिंता की बात यह है कि आपका उत्तर शताब्दी को चुनता है , न कि वर्तमान वर्ष को। और यदि आप सप्ताह की संख्या के लिए स्ट्रिंग प्रारूपण का उपयोग करने जा रहे हैं, तो वर्ष का समावेश करने के लिए भी इसका उपयोग क्यों न करें?
मार्टिन पीटर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.