如何根据给定的基准日期将日期分成特定的时间范围

问题描述

我有一个与各种Sprint相关指标的CSV文件。这些指标之一在名为 Resolved (已解决)的列中,这是完成特定任务的时间。此列包含格式如下的字符串:“ 2020年5月27日上午3:38”

我需要创建一个新列,其值是通过查看此字符串并确定要为其分配的特定时间范围来确定的。时间范围基于Sprint日期。

在这种情况下,一个Sprint始终为2周,我知道一个Sprint的开始日期(2020年7月8日)。 因此,要计算冲刺日期,我们需要从2020年7月8日起前后2周。 例如,7月的另一个冲刺将是7月22日。同样,6月将是6月10日和24日,依此类推。

作为一个端到端的示例,如果某行的日期为“ 2020年5月18日下午4:58”,则需要计算正确的Sprint开始日期以分配给该行。在这种情况下,正确的日期应该是2020年5月13日。(通过从7月8日开始直到两周的时间间隔,直到我们到达5月,然后检查5月18日是否属于5月13日或5月27日,才算正确)。 但是,如果日期改为5月12日,则该日期将属于上一个冲刺的前几个月,即2020年4月29日。

再举一个例子,如果我们收到“ 2020年8月7日上午5:45”,那么正确的日期将是2020年8月5日。

我正在将CSV字符串转换为这样的日期:

new_date = datetime.strptime('May 27,2020 3:38 AM','%b %d,%Y %H:%M %p').date()

我写出了自己的解决方案,它或多或少地满足了我的要求:

#Base sprint date
base = '2020/07/08'
base_date = datetime.strptime(base,'%Y/%m/%d').date()
base_month = 7

#Converts the given string from the CSV
new_date = datetime.strptime(date,%Y %H:%M %p').date()
new_month = new_date.month

diff = new_month - base_month

if diff == 0:
    date_1 = base_date
    date_2 = base_date + relativedelta(weeks=+2)
    date_3 = base_date + relativedelta(weeks=-2)
            
    if new_date < date_2 and new_date >= date_1:
        return date_1

    elif new_date >= date_2:
        return date_2
    
    elif new_date < date_1:
        return date_3

elif diff < 0:
    diff = base_month - new_month

    base_num = 2*(diff + (diff-1))
            
    date_1 = base_date - relativedelta(weeks=+base_num)
    date_2 = base_date - relativedelta(weeks=+(base_num+2))
    date_3 = base_date - relativedelta(weeks=+(base_num+4))

    if new_date >= date_2 and new_date < date_1:
        return date_2
   
    elif new_date >= date_1:
        return date_1 
   
    elif new_date < date_2:
        return date_3 


elif diff > 0:
    base_num = 2*(diff + (diff-1))
            
    date_1 = base_date + relativedelta(weeks=+base_num)
    date_2 = base_date + relativedelta(weeks=+(base_num+2))
    date_3 = base_date + relativedelta(weeks=+(base_num+4))

    if new_date >= date_2 and new_date < date_3:
        return date_2
    
    elif new_date >= date_3:
        return date_3
    
    elif new_date < date_2:
        return date_1

但是,尽管我没有太多的编程经验,但看起来还是很糟糕,我想寻找更好的方法来做到这一点。另外,我不必担心今年。这只是一回事,而且只涉及到2020年。尽管如果您的解决方案也能满足几年的需求,那么我将对definitley感兴趣。很乐意提供更多细节,并消除我的歧义。

解决方法

听起来像您实际需要的是在时间戳上使用取模函数,除以两周的秒数。如果从时间戳中减去该时间,则会获得相关的2周阻止开始日期。

import time
from datetime import datetime,date

d = date(2015,1,5)
unixtime = time.mktime(d.timetuple())
twoweekseconds = 14*24*60*60

timepastmark = unixtime % twoweekseconds

twoweekboundary = unixtime - timepastmark

别忘了相关的时区转换和偏移量,我相信您可以自己解决。