Python 在时间跨度中搜索
我有这个带有时间戳的列表,我希望能够根据用户输入(小时作为一个工作流:Python 在时间跨度中搜索,python,search,timespan,Python,Search,Timespan,我有这个带有时间戳的列表,我希望能够根据用户输入(小时作为一个工作流: 使用datetime模块,使用strtime方法将字符串转换为datetime对象:您将获得datetime对象的列表 通过从最后一个列表中减去此列表的每个条目来计算时间增量 您可以使用timedelta的seconds属性来确定一个点与参考点之间的秒数:将其与3*3600(3h)进行比较,以确定哪些项目属于正确的时间段 类似的方法应该可以奏效 ls = ['2002-03-31 19:30:41', '2002-03-
- 使用
模块,使用datetime
方法将字符串转换为strtime
对象:您将获得datetime
对象的列表datetime
- 通过从最后一个列表中减去此列表的每个条目来计算时间增量
- 您可以使用
的timedelta
属性来确定一个点与参考点之间的秒数:将其与seconds
(3h)进行比较,以确定哪些项目属于正确的时间段3*3600
ls = ['2002-03-31 19:30:41', '2002-03-31 19:30:41', '2002-03-31 19:43:49', '2002-03-31 19:43:50', '2002-03-31 19:50:05', '2002-03-31 19:50:06', '2002-03-31 19:50:06', '2002-03-31 19:50:44', '2002-03-31 19:50:45', '2002-03-31 19:50:45', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:53:05', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:17', '2002-03-31 19:54:14', '2002-03-31 19:54:14']
# target is one of the items in the list
target = datetime.strptime('2002-03-31 19:53:17', '%Y-%m-%d %H:%M:%S')
for l in ls:
print datetime.strptime(l, '%Y-%m-%d %H:%M:%S') - target
印刷品
-1 day, 23:37:24
-1 day, 23:37:24
-1 day, 23:50:32
-1 day, 23:50:33
-1 day, 23:56:48
-1 day, 23:56:49
-1 day, 23:56:49
-1 day, 23:57:27
-1 day, 23:57:28
-1 day, 23:57:28
-1 day, 23:58:33
-1 day, 23:58:33
-1 day, 23:58:33
-1 day, 23:59:08
-1 day, 23:59:08
-1 day, 23:59:08
-1 day, 23:59:48
-1 day, 23:59:49
-1 day, 23:59:49
-1 day, 23:59:49
0:00:00
0:00:57
0:00:57
datetime.strtime(l、%Y-%m-%d%H:%m:%S')-target
返回一个timedelta
对象()。您可以访问timedelta
对象days
、seconds
和microseconds
属性,并将它们与所需的时间跨度进行比较。例如,要获取从某个参考点开始不到一小时发生的所有事件的所有索引:
less_than_an_hour = []
for i,l in enumerate(ls):
if (datetime.strptime(l, '%Y-%m-%d %H:%M:%S') - target).seconds < 3600:
less_than_an_hour.append(i)
少于一小时=[]
对于枚举中的i,l(ls):
如果(datetime.strTime(l,'%Y-%m-%d%H:%m:%S')-目标)。秒<3600:
少于一小时。附加(i)
您非常幸运,因为您的时间戳以最简单的排序顺序排列,您可以将整个“转换为时间值”,只需进行字符串比较:
times = ['2002-03-31 19:30:41', '2002-03-31 19:30:41', '2002-03-31 19:43:49', '2002-03-31 19:43:50', '2002-03-31 19:50:05', '2002-03-31 19:50:06', '2002-03-31 19:50:06', '2002-03-31 19:50:44', '2002-03-31 19:50:45', '2002-03-31 19:50:45', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:53:05', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:17', '2002-03-31 19:54:14', '2002-03-31 19:54:14']
activity= ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w']
start = '2002-03-31 16:54:14'
end = '2002-03-31 19:54:14'
for time, activity in zip(times, activity):
if time >= start and time <= end:
print time, activity
次数=['2002-03-31 19:30:41', '2002-03-31 19:30:41', '2002-03-31 19:43:49', '2002-03-31 19:43:50', '2002-03-31 19:50:05', '2002-03-31 19:50:06', '2002-03-31 19:50:06', '2002-03-31 19:50:44', '2002-03-31 19:50:45', '2002-03-31 19:50:45', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:53:05', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:17', '2002-03-31 19:54:14', '2002-03-31 19:54:14']
活度=['a'、'b'、'c'、'd'、'e'、'f'、'g'、'h'、'i'、'j'、'k'、'l'、'm'、'n'、'o'、'p'、'q'、'r'、's'、't'、'u'、'v'、'w']
开始='2002-03-3116:54:14'
完=‘2002-03-3119:54:14’
对于时间,zip中的活动(时间,活动):
如果时间>=开始和时间我会:
- 将时间戳列表转换为
datetime
对象:
times = [datetime.datetime.strptime(t, '%Y-%m-%d %H:%M:%S') for t in times]
- 使用查找用户请求的开始时间。如果您也将用户输入转换为
datetime
对象,则使用bisect
比使用线性搜索快得多:
start = datetime.datetime(2002, 3, 31, 19, 53, 17)
startindex = bisect.bisect_left(times, start)
- 使用函数将两个列表合并为一个,以显示与您的范围匹配的条目:
end = datetime.datetime(2002, 4, 1, 07, 53, 17)
merged = itertools.izip(times, activity)
fromstart = itertools.islice(merged, startindex)
untilend = itertools.takewhile(lambda e: e[0] <= end, fromstart)
用户多久搜索一次此信息?时间戳列表有多大?@MartijnPieters不太常见,执行时间不重要。大约14000个时间戳。谢谢!我如何转换用户输入,比如说13天(从午夜开始)要开始?请查看datetime
模块。您可以使用类似start=(datetime.date.today()-datetime.timedelta(days=13)).strftime(“%Y-%m-%d 00:00:00”)
的内容预先计算开始日期,然后将if
语句更改为if time>=start:…
。
end = datetime.datetime(2002, 4, 1, 07, 53, 17)
merged = itertools.izip(times, activity)
fromstart = itertools.islice(merged, startindex)
untilend = itertools.takewhile(lambda e: e[0] <= end, fromstart)
>>> import itertools
>>> import datetime
>>> import bisect
>>> times = ['2002-03-31 19:30:41', '2002-03-31 19:30:41', '2002-03-31 19:43:49', '2002-03-31 19:43:50', '2002-03-31 19:50:05', '2002-03-31 19:50:06', '2002-03-31 19:50:06', '2002-03-31 19:50:44', '2002-03-31 19:50:45', '2002-03-31 19:50:45', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:51:50', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:52:25', '2002-03-31 19:53:05', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:06', '2002-03-31 19:53:17', '2002-03-31 19:54:14', '2002-03-31 19:54:14']
>>> activity= ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w']
>>> times = [datetime.datetime.strptime(t, '%Y-%m-%d %H:%M:%S') for t in times]
>>> start = datetime.datetime(2002, 3, 31, 19, 53, 17)
>>> end = datetime.datetime(2002, 4, 1, 07, 53, 17)
>>> startindex = bisect.bisect_left(times, start)
>>> merged = itertools.izip(times, activity)
>>> fromstart = itertools.islice(merged, startindex)
>>> untilend = itertools.takewhile(lambda e: e[0] <= end, fromstart)
>>> for time, activity in untilend:
... print time, activity
...
2002-03-31 19:30:41 a
2002-03-31 19:30:41 b
2002-03-31 19:43:49 c
2002-03-31 19:43:50 d
2002-03-31 19:50:05 e
2002-03-31 19:50:06 f
2002-03-31 19:50:06 g
2002-03-31 19:50:44 h
2002-03-31 19:50:45 i
2002-03-31 19:50:45 j
2002-03-31 19:51:50 k
2002-03-31 19:51:50 l
2002-03-31 19:51:50 m
2002-03-31 19:52:25 n
2002-03-31 19:52:25 o
2002-03-31 19:52:25 p
2002-03-31 19:53:05 q
2002-03-31 19:53:06 r
2002-03-31 19:53:06 s
2002-03-31 19:53:06 t