用python比较时间

时间:2015-05-12 18:31:00

标签: python datetime

我在标有日期的文件中有数据,例如'2015.05.05-11:46',并且想要读取这些行,然后查看它们是否满足某些条件。例如,作为函数的输入,我可能有

get_times('hour', -3.0, -1.2)

具有功能定义:

get_times(unit, start_time, end_time):

这意味着我想要返回从过去-3.0小时到过去-1.2小时的所有字符串。我可以使用now = datetime.datetime.now()获取当前时间。假设我在time1 = '2015.05.05-11:46'中读到,如何将其与now进行比较,并从现在开始查看它是否在start_timeend_time unit内?

5 个答案:

答案 0 :(得分:1)

您可以正常使用<>运营商 但要实现这一点,您必须使所有数据都为datetime类型。

例如:

time_str = "2015.05.05-11:46"
reference_time = datetime.datetime.strptime(time_str, "%Y.%m.%d-%H:%M")

start_time = reference_time - datetime.timedelta(hours=3)
end_time = reference_time - datetime.timedelta(hours=1.2)
now = datetime.datetime.now()

if end_time <= now <= start_time:
    print 'It is in between'

您还可以使用字典将参数传递给timedelta函数:

>>> a = datetime.timedelta(hours=3, minutes=10)
>>> args = {'hours': 3, 'minutes': 10}
>>> b = datetime.timedelta(**args)
>>> a == b
True

答案 1 :(得分:1)

使用datetime.strptime转换字符串'2015.05.05-11:46'

then = datetime.datetime.strptime('2015.05.05-11:46', "%Y.%m.%d-%H:%M")

now = datetime.datetime.now()

然后使用datetime.timedelta来比较时间。

tdelta = now - then

if datetime.timedelta(hours=1.2) < tdelta < datetime.timedelta(hours=3.0):
    print "In range"

为了编写你的函数,你可能想要坚持使用datetime.timedelta中的单位,除非你有充分的理由不这样做。

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

所以,'days', 'seconds', 'microseconds', 'milliseconds', 'minutes', 'hours', 'weeks'

答案 2 :(得分:1)

希望这就是你要找的东西:

import datetime
import time


def get_times(unit, start_time, end_time):
    now = datetime.datetime.now().timetuple()
    matched_dates = []
    for date in your_file:
        converted_date = time.strptime(date,"%Y.%m.%d-%H:%M")
        if converted_date.tm_hour > (now.tm_hour + start_time) and converted_date.tm_hour < (now.tm_hour + end_time):
            matched_dates.append(date)
    return matched_dates

答案 3 :(得分:1)

在您的情况下,有几件事情需要做。首先,您需要将日期时间字符串转换为datetime对象以便于比较。我们通过strptime

执行此操作
test

我们还需要根据您的输入返回开始和结束时间的功能。如果您可以稍加修改并使用test2代替input_datetime = datetime.datetime.strptime(i, '%Y.%m.%d-%H:%M') ,我们可以在不设置大hours块的情况下执行此操作。

hour

这将使您的if/elif创建一个作为关键字参数传递给timedelta的字典。由于def get_times(unit, start_time, end_time): now = datetime.datetime.now() start_kwarg = {unit: start_time} end_kwarg = {unit: end_time} time_start = now + datetime.timedelta(**start_kwarg) time_end = now + datetime.timedelta(**end_kwarg) return time_start, time_end 是其接受的参数之一,因此我们可以使用关键字而不是将unit映射到hours。然后我们返回开始和结束时间。

最后,我们只需要比较输入时间是在开始和结束之间:

hour

最终脚本可能如下所示:

hours

输出看起来像这样(如果在2015-05-12下午12:46运行):

start < input_datetime < end

答案 4 :(得分:0)

要比较文件的时间,您应该将其转换为UTC时间(POSIX时间戳)或有意识的日期时间对象(本地时间+ utc偏移量)。

start_time, end_time = get_times('hour', -3, -1.2)
if start_time <= utc_time < end_time:
   # utc_time is in between

您应该使用start_time <= naive_local_time < end_timeConvert input time to UTC or create an aware datetime objects instead

如果输入文件中的本地时间是连续的,那么您可以根据需要使用该事实消除时间戳的歧义,请参阅Parsing of Ordered Timestamps in Local Time (to UTC) While Observing Daylight Saving Time

使用time.mktime()pytz,感知日期时间对象的更多解释和解决方案位于:Find if 24 hrs have passed between datetimes - Python

为什么不应该使用datetime.now()

datetime.now()返回本地时间,因为天真的日期时间对象可能不明确,例如在DST过渡期间:

>>> from datetime import datetime
>>> import pytz
>>> tz = pytz.timezone('America/New_York')
>>> tz.localize(datetime(2015,11,1,1,30), is_dst=None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/pytz/tzinfo.py", line 349, in localize
    raise AmbiguousTimeError(dt)
pytz.exceptions.AmbiguousTimeError: 2015-11-01 01:30:00
>>> tz.localize(datetime(2015,11,1,1,30), is_dst=True).astimezone(pytz.utc)
datetime.datetime(2015, 11, 1, 5, 30, tzinfo=<UTC>)
>>> tz.localize(datetime(2015,11,1,1,30), is_dst=False).astimezone(pytz.utc)
datetime.datetime(2015, 11, 1, 6, 30, tzinfo=<UTC>)

注意:如果删除UTC偏移,则相同的本地时间可能对应于不同的UTC时间。 datetime.utcnow()是明确的(除了闰秒期间,例如2015-06-30T23:59:60Z)。

如何实施get_times('hour', -3.0, -1.2)

使用UTC时间或感知日期时间对象:

#!/usr/bin/env python
from datetime import datetime, timedelta

def get_times(unit, relative_start, relative_end):
    relative_start, relative_end = [timedelta(**{unit+'s': v})
                                    for v in [relative_start, relative_end]]
    now = datetime.utcnow() # or datetime.now(timezone.utc).astimezone()
    return now + relative_start, now + relative_end
相关问题