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
    属性来确定一个点与参考点之间的秒数:将其与
    3*3600
    (3h)进行比较,以确定哪些项目属于正确的时间段

类似的方法应该可以奏效

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