Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
317 views
in Technique[技术] by (71.8m points)

python - Extract time from datetime and determine if time (not date) falls within range?

The problem is that I want it to ignore the date and only factor in the time. Here is what I have:

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

As is, I get this error:

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

When I change the relevant line to:

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

I get this error:

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

I know I'm working with two different libraries or whatnot, but I'm not sure how to convert between them or accomplish what I want to do only using one. I just want it to ignore the date and only check if the time is within the specified ranges. Python 2.6 is a MUST due to a library I'm using elsewhere in the code.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This line:

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

returns a datetime object as per the docs.

You can test this yourself by running the following command interactively in the interpreter:

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

The time portion of the returned datetime can then be accessed using the .time() method.

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

The datetime.time() result can then be used in your time comparisons.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...