逻辑参数没有正确约束

时间:2014-07-01 18:00:58

标签: python

我正在写一些我正在编写的问题但似乎无法理清原因。

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

这就是它应该停止的地方。相反,它会一直持续下去。我不确定逻辑细分在哪里,但我会感谢你的帮助。

2 个答案:

答案 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

如果您想对原始日期进行计算并避免使用timedeltad.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'