我正在写一些我正在编写的问题但似乎无法理清原因。
dayCurrent = datetime.date.today().strftime("%j")
dayStop = (int(dayCurrent) - 14)
yearCurrent = datetime.date.today().strftime("%Y")
其他变量是doy(Julian day of year),year和daysVar(增量天数)。这三个变量由用户输入。
def yearChange (doy,year,yearCurrent):
if doy > 365:
if calendar.isleap:
doy = (366 - int(doy))
year = (int(year) + 1)
else:
doy = (365 - int(doy))
year = (int(year) + 1)
return doy,year
while (yearCurrent > year) or ((int(dayStop) < int(doy)) and (yearCurrent == year)):
doy = int(doy) + int(daysVar)
doy,year = yearChange(doy,year,yearCurrent)
print doy
print year
当我运行它时,它不会停止,并且减法有些奇怪。例如,如果doy = 30,year = 2013,daysVar = 100,我就会得到这个......
130
2013
230
2013
330
2013
2014
-64
2014
36
2014
136
2014
236
2014
这就是它应该停止的地方。相反,它会一直持续下去。我不确定逻辑细分在哪里,但我会感谢你的帮助。
答案 0 :(得分:2)
让我们稍微尝试一下:
import datetime
now = datetime.date.today()
stop = datetime.date.today - datetime.timedelta(14)
step = datetime.timedelta(100)
d = datetime.date(2013, 5, 23)
while d < stop:
d += step
...
如果你想从2013年5月23日开始,一次提前100天,直到两周后。
除了轻微的错误估计之外,关于你的代码的另一个注意事项是,有一个非常奇怪的结果的机会:
dayCurrent = datetime.date.today().strftime("%j")
dayStop = (int(dayCurrent) - 14)
yearCurrent = datetime.date.today().strftime("%Y")
如果你在12月31日23:59:59触发这个怎么办?您可能拥有上一年的dayCurrent
和来自明年的yearCurrent
。所以,应该这样做:
d = datetime.date.today()
# instead of dayCurrent, use d.timetuple().tm_yday
# instead of yearCurrent, use d.year
如果您想对原始日期进行计算并避免使用timedelta
,d.toordinal()
会为您提供从第1年开始计算的日期数。同样,您可以从nuber开始创建日期时间对象。第1年datetime.date.fromordinal
。因此,向后计算14天的一种方法是:
two_weeks_ago = datetime.fromordinal(d.toordinal() - 14)
但是timedelta
真的是用于这种计算。
答案 1 :(得分:2)
你有三个问题。
首先是你如何更新doy。
if calendar.isleap:
doy = (366 - int(doy))
year = (int(year) + 1)
else:
doy = (365 - int(doy))
year = (int(year) + 1)
应该是:
if calendar.isleap:
doy = doy - 366
year = (int(year) + 1)
else:
doy = doy - 365 #or with the int(doy), I don't see why it matters
year = (int(year) + 1)
让我们看一下从2013年到2014年的转变。你有330,然后加了100 - 现在它是430.你想要的是成为430 - 366 = 64,但它变成366-430 = -64
第二 - 您的标准确实存在问题。在while循环中,您没有指定停止条件,而是指定&#34; continue-criteria&#34;。因此,如果我们在同一年,我们应该在doy小于我们当天的时候继续,并在它变得更大时停止。所以你的时间应该是:
while (yearCurrent > year) or ((int(dayStop) > int(doy)) and (yearCurrent == year)):
第三 -
将变量定义为整数:
dayCurrent = int(datetime.date.today().strftime("%j"))
yearCurrent = int(datetime.date.today().strftime("%Y"))
否则yearCurrent > year
将始终为true,因为当python类型不同时,python按类型名称按字母顺序排序('str'>'int'
)