Аргумент OverflowError mktime вне допустимого диапазона

После решения наивной проблемы с датой и временем я столкнулся с новой проблемой в представлении для создания графиков. Теперь я получаю аргумент mktime вне допустимого диапазона. Я понятия не имею, как это решить. Я не писал код, я использую его от своего коллеги, и я не могу понять, почему он терпит неудачу. Я думаю, что это связано с функцией, которая работает сверхурочно, и появляется ошибка.

@login_required(login_url='/accounts/login/')
def loggedin(request):
    data = []
    data2 = []
    data3 = []
    dicdata2 = {}
    dicdata3 = {}
    datainterior = []
    today = timezone.localtime(timezone.now()+timedelta(hours=1)).date()
    tomorrow = today + timedelta(1)
    semana= today - timedelta(7)
    today = today - timedelta(1)
    semana_start = datetime.combine(today, time())
    semana_start = timezone.make_aware(semana_start, timezone.utc)
    today_start = datetime.combine(today, time())
    today_start = timezone.make_aware(today_start, timezone.utc)
    today_end = datetime.combine(tomorrow, time())
    today_end = timezone.make_aware(today_end, timezone.utc)
    for modulo in Repository.objects.values("des_especialidade").distinct():
        dic = {}
        mod = str(modulo['des_especialidade'])
        dic["label"] = str(mod)
        dic["value"] = Repository.objects.filter(des_especialidade__iexact=mod).count()
        data.append(dic)
    for modulo in Repository.objects.values("modulo").distinct():
        dic = {}
        mod = str(modulo['modulo'])
        dic["label"] = str(mod)
        dic["value"] = Repository.objects.filter(modulo__iexact=mod, dt_diag__gte=semana_start).count()
        datainterior.append(dic)
        # print mod, Repository.objects.filter(modulo__iexact=mod).count()
        # data[mod] = Repository.objects.filter(modulo__iexact=mod).count()
    dicdata2['values'] = datainterior
    dicdata2['key'] = "Cumulative Return"
    dicdata3['values'] = data
    dicdata3['color'] = "#d67777"
    dicdata3['key'] = "Diagnosticos Identificados"
    data3.append(dicdata3)
    data2.append(dicdata2)



    #-------sunburst
    databurst = []
    dictburst = {}
    dictburst['name'] = "CHP"
    childrenmodulo = []
    for modulo in Repository.objects.values("modulo").distinct():
        childrenmodulodic = {}
        mod = str(modulo['modulo'])
        childrenmodulodic['name'] = mod
        childrenesp = []
        for especialidade in Repository.objects.filter(modulo__iexact=mod).values("des_especialidade").distinct():
            childrenespdic = {}
            esp = str(especialidade['des_especialidade'])
            childrenespdic['name'] = esp
            childrencode = []
            for code in Repository.objects.filter(modulo__iexact=mod,des_especialidade__iexact=esp).values("cod_diagnosis").distinct():
                childrencodedic = {}
                codee= str(code['cod_diagnosis'])
                childrencodedic['name'] = 'ICD9 - '+codee
                childrencodedic['size'] = Repository.objects.filter(modulo__iexact=mod,des_especialidade__iexact=esp,cod_diagnosis__iexact=codee).count()
                childrencode.append(childrencodedic)
            childrenespdic['children'] = childrencode



            #childrenespdic['size'] = Repository.objects.filter(des_especialidade__iexact=esp).count()
            childrenesp.append(childrenespdic)
        childrenmodulodic['children'] = childrenesp
        childrenmodulo.append(childrenmodulodic)
    dictburst['children'] = childrenmodulo
    databurst.append(dictburst)
    # print databurst



    # --------stacked area chart
    datastack = []
    for modulo in Repository.objects.values("modulo").distinct():
        datastackdic = {}
        mod = str(modulo['modulo'])
        datastackdic['key'] = mod
        monthsarray = []
        year = timezone.localtime(timezone.now()+timedelta(hours=1)).year
        month = timezone.localtime(timezone.now()+timedelta(hours=1)).month
        last = timezone.localtime(timezone.now()+timedelta(hours=1)) - relativedelta(years=1)
        lastyear = int(last.year)
        lastmonth = int(last.month)
        #i = 1
        while lastmonth <= int(month) or lastyear<int(year):
            date = str(lastmonth) + '/' + str(lastyear)
            if (lastmonth < 12):
                datef = str(lastmonth + 1) + '/' + str(lastyear)
            else:
                lastmonth = 01
                lastyear = int(lastyear)+1
                datef = str(lastmonth)+'/'+ str(lastyear)
                lastmonth = 0
            datainicial = datetime.strptime(date, '%m/%Y')
            datainicial = timezone.make_aware(datainicial, timezone.utc)
            datafinal = datetime.strptime(datef, '%m/%Y')
            datafinal = timezone.make_aware(datafinal, timezone.utc)
            #print "lastmonth",lastmonth,"lastyear", lastyear
            #print "datainicial:",datainicial,"datafinal: ",datafinal
            filtro = Repository.objects.filter(modulo__iexact=mod)
            count = filtro.filter(dt_diag__gte=datainicial, dt_diag__lt=datafinal).count()
            conv = datetime.strptime(date, '%m/%Y')
            ms = datetime_to_ms_str(conv)
            monthsarray.append([ms, count])
            #i += 1
            lastmonth += 1
        datastackdic['values'] = monthsarray
        datastack.append(datastackdic)
        #print datastack


    if request.user.last_login is not None:
        #print(request.user.last_login)
        contador_novas = Repository.objects.filter(dt_diag__lte=today_end, dt_diag__gte=today_start).count()
    return render_to_response('loggedin.html',
                              {'user': request.user.username, 'contador': contador_novas, 'data': data, 'data2': data2,
                               'data3': data3,
                               'databurst': databurst, 'datastack':datastack})


def datetime_to_ms_str(dt):
    return str(1000 * mktime(dt.timetuple()))

person Bruno Fernandes    schedule 14.12.2015    source источник
comment
Какое значение dt.timetuple() вызывает ошибку?   -  person Alasdair    schedule 14.12.2015
comment
Где-то 3001. Я не могу понять, почему функция все время продолжается и продолжается.   -  person Bruno Fernandes    schedule 14.12.2015
comment
Так что проблема на самом деле не в mktime, а в цикле, который не заканчивается, когда вы ожидаете. Какие значения вы получили, когда печатали lastmonth и lastyear в каждом цикле? Что вы ожидали? Установка lastmonth = 0 мне кажется ошибкой.   -  person Alasdair    schedule 14.12.2015
comment
Проблема должна быть внутри файла while loop. Проблема существует только тогда, когда месяц = ​​12, поэтому он работал до 12.01. Во всяком случае, я понятия не имею, как это решить. Основная идея состоит в том, чтобы сделать диаграмму с областями с накоплением от текущего месяца прошлого года до текущего месяца этого года. Цикл не останавливается, а затем повторяется в течение многих лет и месяцев. Не знаю, почему. Я уверен, что ответ прямолинеен, но я не могу его решить   -  person Bruno Fernandes    schedule 15.12.2015


Ответы (1)


Думаю проблема в этом состоянии.

while lastmonth <= int(month) or lastyear<int(year):

В декабре month=12, поэтому lastmonth <= int(month) всегда будет True. Таким образом, цикл всегда будет возвращать True, даже если lastyear больше текущего year.

Вы хотите зациклиться, если цикл находится в предыдущем году или если цикл находится в текущем году, а месяц не в будущем. Поэтому, я думаю, вы хотите изменить его на следующее:

while lastyear < year or (lastyear == year and lastmonth <= month):

Чтобы убедиться, что код работает и понять его, вам нужно добавить в циклы множество операторов печати, посмотреть, как изменяются lastmonth и lastyear, и убедиться, что цикл завершается, когда вы ожидаете. Вам также нужно протестировать его для других значений year и month, чтобы он не сломался в следующем месяце. В идеале вы хотите извлечь этот фрагмент кода в отдельную функцию. Было бы легче понять цикл, если бы он возвращал только список из (month, year) целых чисел, вместо того, чтобы одновременно выполнять множество форматов даты. Тогда было бы проще добавить юнит-тесты.

person Alasdair    schedule 15.12.2015
comment
Ты гений. Это решило мою проблему. Теперь, пожалуйста, не могли бы вы объяснить, почему это сработало, как будто я был слишком тупым? - person Bruno Fernandes; 15.12.2015
comment
На самом деле, я думаю, что ответ, который я написал ранее, был неправильным и сработает только в декабре. Смотрите мой обновленный ответ. Лучший способ понять код — добавить множество операторов печати и убедиться, что он работает так, как вы ожидаете. - person Alasdair; 15.12.2015
comment
Ваш последний ответ все еще работает, поэтому я собираюсь использовать его. В любом случае, мне нужно понять эту логику, потому что в этом случае я могу сильно запутаться. - person Bruno Fernandes; 15.12.2015