Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表中获取两个日期之间的元素_Python - Fatal编程技术网

Python 从列表中获取两个日期之间的元素

Python 从列表中获取两个日期之间的元素,python,Python,我有一份清单,清单如下: A = [['05-22-2013', '0.5553', '0.887', '0.14'], ['05-22-2013', '0.3442', '0.345', '0.0'], ['05-22-2013', '0.3', '0.7', '0.4'], ['05-23-2013', '0.53', '0.87', '0.4'], ['05-23-2013', '0.9', '0.8', '0.1'], ['05

我有一份清单,清单如下:

A = [['05-22-2013', '0.5553', '0.887', '0.14'], 
     ['05-22-2013', '0.3442', '0.345', '0.0'], 
     ['05-22-2013', '0.3', '0.7', '0.4'], 
     ['05-23-2013', '0.53', '0.87', '0.4'], 
     ['05-23-2013', '0.9', '0.8', '0.1'], 
     ['05-23-2013', '0.0', '0.799', '0.214'],
     ['05-24-2013', '0.053', '0.7', '0.1422'], 
     ['05-25-2013', '0.5', '0.110', '0.200'], 
     ['05-25-2013', '0.311', '0.799', '0.426'], 
     ['05-25-2013', '0.311', '0.091', '0.41']]
我想选择从'05-22-2013'到'05-24-2013'之间的所有元素。我尝试的是手动获取数组中每个日期对应的所有元素,并将它们全部附加到一个列表中。比如一次约会:

date_1 = []

for u in A:
    if '05-22-2013' in u:
        date_1.append(u)

因此,具体来说,获取此类列表中给定日期范围内的所有项目的最佳方法是什么?

要简单地获取与给定日期匹配的所有列表项,可以构建列表理解:

print [entry for entry in A if entry[0] == '05-25-2013']
返回:

[['05-25-2013', '0.5', '0.110', '0.200'], ['05-25-2013', '0.311', '0.799', '0.426'], ['05-25-2013', '0.311', '0.091', '0.41']]
当然,这种方法只处理一个日期,但可以在if中修改以处理其他日期。缺点是您必须明确列出范围内的每个日期,因为它们都被解释为字符串


但是,如果您确实需要能够输入一个范围,那么您必须更加深入,并且可能需要使用datetime模块,该模块将其转换为能够使用>和来简单地获取与给定日期匹配的所有列表项的数据类型,您可以构建一个列表理解:

print [entry for entry in A if entry[0] == '05-25-2013']
返回:

[['05-25-2013', '0.5', '0.110', '0.200'], ['05-25-2013', '0.311', '0.799', '0.426'], ['05-25-2013', '0.311', '0.091', '0.41']]
当然,这种方法只处理一个日期,但可以在if中修改以处理其他日期。缺点是您必须明确列出范围内的每个日期,因为它们都被解释为字符串


但是,如果您真的需要能够输入一个范围,那么您必须更加深入,并且可能需要使用datetime模块,该模块将其转换为能够使用>和的数据类型。如果线性时间预处理是一个选项,则首先将键日期输出到一个单独的列表中。要使其可排序,请首先将其转换为datetime对象

>>> from datetime import datetime
>>> def parsedate(s):
...     return datetime.strptime(s, '%M-%d-%Y')
>>> keys = [parsedate(x[0]) for x in A]
然后,您可以进行二进制搜索,以在Olg n时间内廉价地进行范围搜索:

>>> from bisect import bisect_left, bisect_right
>>> left = bisect_left(keys, parsedate('05-22-2013'))
>>> right = bisect_right(keys, parsedate('05-24-2013'))

现在,一个[left:right]就是您要查找的范围。

如果线性时间预处理是一个选项,那么首先将关键点日期放入一个单独的列表中。要使其可排序,请首先将其转换为datetime对象

>>> from datetime import datetime
>>> def parsedate(s):
...     return datetime.strptime(s, '%M-%d-%Y')
>>> keys = [parsedate(x[0]) for x in A]
然后,您可以进行二进制搜索,以在Olg n时间内廉价地进行范围搜索:

>>> from bisect import bisect_left, bisect_right
>>> left = bisect_left(keys, parsedate('05-22-2013'))
>>> right = bisect_right(keys, parsedate('05-24-2013'))

现在你要找的是[left:right]范围。

我不知道这是否是最好的方法,因为老实说,最好是一个非常主观的术语

from datetime import date

start_date = date(2013, 5, 22)
end_date = date(2013, 5, 24)

data = []

for i in A:
    month, day, year = i[0].split('-')
    record_date = date(year, month, day)
    if record_date >= start_date and record_date <= end_date:
        data.append(i)

我不知道这是否是最好的方法,因为老实说,最好是一个非常主观的术语

from datetime import date

start_date = date(2013, 5, 22)
end_date = date(2013, 5, 24)

data = []

for i in A:
    month, day, year = i[0].split('-')
    record_date = date(year, month, day)
    if record_date >= start_date and record_date <= end_date:
        data.append(i)

这很好……我认为,在给定日期范围内的所有日期的参考列表可以用作从a中选择所有元素的参考。这样做很容易。谢谢:-。如果你有一个日期列表,你可以把它们放在一个列表中,然后用in*替换if中的==,这很好。我认为,给定日期范围内的所有日期的引用列表可以用作从a中选取所有元素的引用。这样做很容易。谢谢:-。如果你有一个日期列表,你可以把它们放在一个列表中,然后用in*替换if中的==这是迄今为止最优雅的一个…很好的方法。谢谢。如果日期跨度超过2年05-22-2012>04-22,则不起作用-2013@njzk2你说得对。添加了OP首先解析日期的建议。这是迄今为止最优雅的一个…很棒的方法。谢谢。如果日期跨度超过2年05-22-2012>04-22,则不起作用-2013@njzk2你说得对。添加了OP首先解析日期的建议。