gpt4 book ai didi

python - 将一系列日期时间划分为 "sequential"日期时间列表的有效方法?

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:37 27 4
gpt4 key购买 nike

假设“连续”日期时间是彼此在特定时间间隔(即三十分钟)内的日期时间;非顺序日期时间是比彼此之间的时间段更长的日期时间。

给定一个由日期时间列表(作为字符串)组成的输入,我想派生一个顺序日期时间列表的列表。我的解决方案如下,但我想知道是否有更好的方法:

list_of_datetime_strings: ['2016-02-26 10:30:00', '2016-02-26 11:00:00', 
'2016-02-25 11:30:00', '2016-02-25 12:00:00', '2016-02-25 12:30:00',
'2016-02-26 12:30:00']

def find_datetime_sequences(list_of_datetime_strings, increment_in_minutes = 30):
if not list_of_datetime_strings:
return

str_to_datetime = lambda cur_datetime: datetime.strptime(cur_datetime, "%Y-%m-%d %H:%M:%S")
list__datetimes_sorted = sorted([str_to_datetime(cur_datetime) for cur_datetime in list_of_datetime_strings])

list_of_datetime_lists = [[list__datetimes_sorted[0]]]

for cur_datetime in list__datetimes_sorted[1:]:
time_difference = (cur_datetime - list_of_datetime_lists[-1][-1]).seconds / 60

if time_difference == increment_in_minutes:
list_of_datetime_lists[-1].append(cur_datetime)
else:
list_of_datetime_lists.append([cur_datetime])

return list_of_datetime_lists

find_datetime_sequences(list_of_datetime_strings)

输出:

list_of_datetime_lists: [[datetime.datetime(2016, 2, 25, 11, 30), 
datetime.datetime(2016, 2, 25, 12, 0), datetime.datetime(2016, 2, 25, 12, 30)],
[datetime.datetime(2016, 2, 26, 10, 30), datetime.datetime(2016, 2, 26, 11, 0)],
[datetime.datetime(2016, 2, 26, 12, 30)]]

是否有更好的方法来实现上述目标?

最佳答案

我没有更好的方法从字符串生成 datetime 对象或对它们进行排序。但我认为可以通过使用生成器而不是常规函数来改进其余部分(如果没有别的,就可读性而言)。

def sequencify(sorted_datetimes, increment_in_minutes=30):
"""Take a sorted list of datetime objects. Yield sequences as lists."""
if not sorted_datetimes:
return

first, *rest = sorted_datetimes
# python 2: first, rest = sorted_datetimes[0], sorted_datetimes[1:]
sequence = [first]
delta = datetime.timedelta(minutes=increment_in_minutes)
while rest:
first, *rest = rest
if first - sequence[-1] > delta:
yield sequence
sequence = [first]
else:
sequence.append(first)
yield sequence

使用基于索引的方法的替代版本,类似于@SimeonVisser 所做的:

def sequencify(sorted_datetimes, increment_in_minutes=30):
"""Take a sorted list of datetime objects. Yield sequences as lists."""
delta = datetime.timedelta(minutes=increment_in_minutes)
start = 0
for i in range(start, len(sorted_datetimes) - 1):
if sorted_datetimes[i+1] - sorted_datetimes[i] > delta:
yield sorted_datetimes[start:i+1]
start = i + 1
if sorted_datetimes:
yield sorted_datetimes[start:]

无论哪种方式,调用者都需要进行最小的更改:只需添加一个 list():

strings = [
'2016-02-26 10:30:00',
'2016-02-26 11:00:00',
'2016-02-25 11:30:00',
'2016-02-25 12:00:00',
'2016-02-25 12:30:00',
'2016-02-26 12:30:00'
]
sorted_datetimes = sorted(datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S')
for s in strings)
print(list(sequencify(sorted_datetimes))) # explicit conversion to list

输出:

[[datetime.datetime(2016, 2, 25, 11, 30),
datetime.datetime(2016, 2, 25, 12, 0),
datetime.datetime(2016, 2, 25, 12, 30)],
[datetime.datetime(2016, 2, 26, 10, 30),
datetime.datetime(2016, 2, 26, 11, 0)],
[datetime.datetime(2016, 2, 26, 12, 30)]]

关于python - 将一系列日期时间划分为 "sequential"日期时间列表的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35613837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com