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

时间:2013-05-28 15:46:46

标签: 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-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)

那么,具体说明一下,获取给定日期范围内所有项目的最佳方法是什么(在这种列表列表中)?

3 个答案:

答案 0 :(得分:3)

我不知道这是否是“最佳”方式,因为说实话,“最好”是一个非常主观的术语。

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)

答案 1 :(得分:2)

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

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模块,这会将其转换为能够使用{{1}的数据类型和> - 类似的运营商。

答案 2 :(得分:0)

如果线性时间预处理是一个选项,那么首先将键(日期)输出到一个单独的列表中。要使它们可订购,请先将它们转换为datetime个对象。

>>> from datetime import datetime
>>> def parsedate(s):
...     return datetime.strptime(s, '%M-%d-%Y')
>>> keys = [parsedate(x[0]) for x in A]

然后你可以廉价地进行二元搜索(在O(lg n)时间内)进行范围搜索:

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

现在A[left:right]是您正在寻找的范围。