我正在尝试找到像YYYYW这样的自定义日期格式。减去一些周期后的201620。
到目前为止,我已经能够使用以下代码将日期字符串(如YYYYW)转换为日期;
from datetime import datetime
myDate = "201642"
year = myDate[:4]
week = myDate[-2:]
day = '1'
myDate = year + " " + week + " " + day
print(myDate)
date = datetime.strptime(myDate, "%Y %W %w")
print(date)
但我无法找到一种可以减去的方法,例如。从201642起43周,获得201552的结果。
编辑1:使用评论中的建议,这是解决方案。
从datetime导入日期时间 来自datetime import timedelta
myDate = "201642"
year = myDate[:4]
week = myDate[-2:]
day = '1'
myDate = year + " " + week + " " + day
print(myDate)
date = datetime.strptime(myDate, "%Y %W %w")
print(date)
new_date = date - timedelta(weeks=42)
str_new_date = datetime.strftime(new_date, '%Y%W')
print(str_new_date)
答案 0 :(得分:2)
除了自己做数学之外,这是尝试使用日期时间。使用ISO周数(使用this answer中的方法)执行所有操作:
if(isTruncated()){ return truncated }else{ return long_data }
@ Hildy的修改版本的答案如下:
>>> import datetime
>>> date = '201642'
>>> weeks = 43
>>> year = date[:4]
>>> week = date[4:]
>>> start = iso_to_gregorian(int(year), int(week), 1)
>>> start
datetime.date(2016, 10, 17)
>>> start.isocalendar()
(2016, 42, 1)
>>> offset_weeks = datetime.timedelta(weeks=43)
>>> end = start - offset_weeks
>>> end
datetime.date(2015, 12, 21)
>>> end.isocalendar()
(2015, 52, 1)
>>> '{}{}'.format(*end.isocalendar())
'201552'
答案 1 :(得分:2)
您实际上并未在示例代码中正确解析日期,但由于您说的是您的实际代码,请忽略它。
所以,你有一个datetime
对象。你想减去43周。所有你需要做的就是......确切地说,使用timedelta
:
>>> dt = datetime.datetime(2016, 10, 21)
>>> dt - datetime.timedelta(weeks=43)
datetime.datetime(2015, 12, 25, 0, 0)
结果是同一时间,一周中的同一天,43周前。
但值得注意的是,对于当地时代而言,由于穿越了夏令时的边界,“同一时间”可能会被关闭一小时。当你正在使用午夜时,一小时的休息可能会特别令人困惑。因此,通常最好使用date
个对象而不是datetime
个对象进行此类工作:
>>> dt = datetime.datetime(2016, 10, 21)
>>> dt.date()
datetime.date(2016, 10, 21)
>>> dt.date() - datetime.timedelta(weeks=43)
datetime.date(2015, 12, 25)
无论哪种方式,如果您想将其重新转换为YYYYWW
字符串,datetime
和date
都有strftime
方法:
>>> d2 = dt - datetime.timedelta(weeks=43)
>>> d2.strftime('%Y%W')
'201551'
答案 2 :(得分:2)
这可以通过dateutil库中的相对delta来完成;应该注意的是,所述库是Python 2x中标准库的一部分,但不是3x ......你必须安装它。
接下来你需要知道的是,根据Python docs,“当与strptime()方法一起使用时,%U
和%W
仅用于计算时指定星期几和年份。“
试试这个:
from dateutil.relativedelta import relativedelta
from datetime import datetime
#I've added the day number here, as described in the docs
myDate = "2016042"
# with '%w' added, strptime() will work
date = datetime.strptime(myDate, "%Y%w%W")
# now use relativedelta() to do the date math
date = date - relativedelta(weeks=2)
# finally, use strftime() to return the date back to the format you like
myDate = date.strftime("%Y%W")
print(string_date)
我在ETL操作中使用它来计算财务期等事情并且效果很好。正如其他人所指出的,timedelta()
可以以类似的方式使用。