我在标有日期的文件中有数据,例如'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_time
和end_time
unit
内?
答案 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_time
。 Convert 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