2016-12-05 191 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

行。我已经调整了我的答案。 –

相关问题