在Python中拼接日期对象列表

0 投票
3 回答
1857 浏览
提问于 2025-04-18 08:05

有没有简单的方法可以从一个日期对象的列表中提取部分内容:

spliced = sortedDates[startDate:endDate]
print spliced

还是说这需要用到枚举?

举个例子

sortedDates = [July 1 2012, July 2 2012, July 3 2012, July 4, 2012]
spliced = sortedDates[July 2 2012:July 4 2012]

3 个回答

0

pandas在处理日期方面非常出色。

import pandas as pd
from datetime import datetime
dr = pd.date_range('2012-07-01', '2012-08-01')
dr[(dr >= datetime(2012,7,4)) & (dr <= datetime(2012,7,8))]
0

你可以通过列表推导式来创建一系列的日期:

start_date = datetime.datetime(2014, 1, 1)
end_date = datetime.datetime(2014, 1, 5)
nb_days = (end_date - start_date).days + 1  # + 1 because range is exclusive
splice = [start_date + datetime.timedelta(days=x) for x in range(nb_days)]

举个例子:

>>> [start_date + datetime.timedelta(days=x) for x in range(0, nb_days)]
[datetime.datetime(2014, 1, 1, 0, 0), datetime.datetime(2014, 1, 2, 0, 0), 
 datetime.datetime(2014, 1, 3, 0, 0), datetime.datetime(2014, 1, 4, 0, 0), 
 datetime.datetime(2014, 1, 5, 0, 0)]

如果你想从已有的日期列表中返回一个子列表,你也可以再次使用列表推导式来构建:

splice = [x for x in original_list if start_date < x < end_date]
5

假设你有一个列表 sortedDates,里面存放着 datetime 对象,还有两个 datetime 对象 minDmaxD,用来定义你的范围:

filtered = [d for d in sortedDates if minD < d < maxD]

或者,更有效的方法是利用这个列表已经排好序的特点,使用二分查找:

from bisect import bisect_left, bisect_right
filtered = sortedDates[bisect_right(sortedDates, minD):bisect_left(sortedDates, maxD)]

撰写回答