web-dev-qa-db-fra.com

Extraire l'heure de datetime et déterminer si l'heure (pas la date) se situe dans la plage?

Le problème est que je veux qu'il ignore la date et ne prenne en compte que l'heure. Voici ce que j'ai:

import time
from time import mktime
from datetime import datetime

def getTimeCat(Datetime):
    # extract time categories
    str_time = datetime.strptime(Datetime, "%m/%j/%y %H:%M")
    ts = datetime.fromtimestamp(mktime(str_time))

    # --> Morning = 0400-1000
    mornStart = datetime.time(4, 0, 1)
    mornEnd = datetime.time(10, 0, 0)

    # --> Midday = 1000-1600
    midStart = datetime.time(10, 0, 1)
    midEnd = datetime.time(16, 0, 0)

    # --> Evening = 1600-2200
    eveStart = datetime.time(16, 0, 1)
    eveEnd = datetime.time(22, 0, 0)

    # --> Late Night = 2200-0400
    lateStart = datetime.time(22, 0, 1)
    lateEnd = datetime.time(4, 0, 0)

    if time_in_range(mornStart, mornEnd, ts):
      timecat = 0 #morning
    Elif time_in_range(midStart, midEnd, ts):
      timecat = 1 #midday
    Elif time_in_range(eveStart, eveEnd, ts):
      timecat = 2 #evening
    Elif time_in_range(lateStart, lateEnd, ts):
      timecat = 3 #late night

    return timecat

En l'état, j'obtiens cette erreur:

TypeError: argument must be 9-item sequence, not datetime.datetime

Lorsque je change la ligne pertinente en:

str_time = time.strptime(Datetime, "%m/%j/%y %H:%M")

Je reçois cette erreur:

TypeError: descriptor 'time' requires a 'datetime.datetime' object but received a 'int'

Je sais que je travaille avec deux bibliothèques différentes ou autre, mais je ne sais pas comment convertir entre elles ou accomplir ce que je veux faire en utilisant une seule. Je veux juste qu'il ignore la date et ne vérifie que si l'heure est dans les plages spécifiées. Python 2.6 est un MUST en raison d'une bibliothèque que j'utilise ailleurs dans le code.

19
Dan

Cette ligne:

str_time = datetime.strptime(Datetime, "%m/%j/%y %H:%M")

renvoie un objet datetimeselon la documentation .

Vous pouvez le tester vous-même en exécutant la commande suivante de manière interactive dans l'interpréteur:

>>> import datetime
>>> datetime.datetime.strptime('12/31/13 00:12', "%m/%j/%y %H:%M")
datetime.datetime(2013, 1, 31, 0, 12)
>>>

La partie temporelle du datetime retourné est ensuite accessible à l'aide de la méthode .time().

>>> datetime.datetime.strptime('12/31/13 00:12', "%m/%j/%y %H:%M").time()
datetime.time(0, 12)
>>>

Le résultat datetime.time() peut ensuite être utilisé dans vos comparaisons de temps.

32
Austin Phillips