2016-12-05 156 views
2

給定一個日期值和一個數字,我想看看這個數字與前幾年當天的數字相比如何。在Python中,我如何根據年份,週數和工作日得到日期?

對於「當日」,我的意思是同一周的數字和同一個工作日,而不是相同的日曆日期。

例如,開始像1975年5月25日的日期:

>>> holyGrail = datetime.datetime(1975,5,25) 

這是第21周的第七天:

>>> holyGrail.isocalendar() 
(1975, 21, 7) 
>>> 

我想拉起7日的日期1974年,1973年等21周的日子。

本質上我想這樣做:

>>> yearBack = datetime.datetime().isocalendar(1974,21,7) 

,並使其返回我的日期匹配星期&工作日,在這種情況下將是1974年5月26日,而不是25:

>>> yearBack = datetime.datetime(1974,5,26) 
>>> yearBack.isocalendar() 
(1974, 21, 7) 
>>> 

我從https://stackoverflow.com/a/28069361/5324657看到,有一個(無證? )格式%V至strftime(),返回ISO-8601的週數,這在strftime的工作正常,似乎是我所需要的,但是當我嘗試使用相同%V格式strptime()我得到的錯誤

ValueError: 'V' is a bad directive in format '%Y-%V-%w' 

我該怎麼辦sily /可靠地拉起同等的Year/WeekNo/Weekday日期?

請注意,我並不在乎新周開始時間或完整週期,我只需要一個一致的方法,可以進行準確的年度比較。

+0

重複的http://stackoverflow.com/a/7687085/5324657,但那個方便的isoweek模塊不是內置的。有沒有內置的方法來做到這一點? –

+1

這個重複的問題給出了唯一的內置方法;如果你的周定義與Python的不匹配(並且你不能使用Python 3.6的ISO友好'strptime'),那麼不會,沒有(適度乾淨的)內置的方式。想要有一個內置的並不是如此。 – ShadowRanger

回答

0

我認爲這應該工作:

def getDate(d, y): 
    s = datetime.date(y, 1, 1) 
    while s.isocalendar()[2] != 4: 
     s += datetime.timedelta(days=1) 
    s += datetime.timedelta(weeks=d.isocalendar()[1]-1, 
          days=d.isocalendar()[2]-s.isocalendar()[2]) 
    if d.isocalendar()[-2:] == s.isocalendar()[-2:]: 
     return s 
    raise ValueError("{} has no equivalent in {}".format(d, y)) 

在公曆中,有些年份52周,部分53,所以並不總是等同日期。它會在這些情況下引發ValueError。

>>>print(getDate(datetime.date(1975, 5, 25), 1974)) 
1974-05-26 

>>>print(getDate(datetime.date(1975, 5, 25), 1973)) 
1973-05-27 

>>>print(getDate(datetime.date(1975, 5, 25), 1972)) 
1972-05-28 

>>>print(getDate(datetime.date(1904, 1, 03), 1978)) 
ValueError: 1904-01-03 has no equivalent in 1978 
+0

'tm_yday'真的很有用,但我是一週中的同一天:我從1975年的第21周的星期天開始,所以我需要1974年(5月26日)和1973年的'21週日星期日' (5月27日)和1972年(5月28日)等等。 –

+0

行。我已經調整了我的答案。 –

相關問題