gpt4 book ai didi

python - 按 timedelta 减少日期时间列表

转载 作者:行者123 更新时间:2023-12-01 04:44:57 24 4
gpt4 key购买 nike

在 python 中,如何通过 timedelta 邻域减少日期时间列表?

如果我有

    dates = [
dt.datetime(1970, 1, 1, 0, 2),
dt.datetime(1970, 1, 1, 0, 3),
dt.datetime(1970, 1, 1, 0, 7),
dt.datetime(1970, 1, 1, 0, 8)
]

和时间增量

delta = dt.timedelta(minutes=2)

我怎样才能得到这个?

    expected = [
dt.datetime(1970, 1, 1, 0, 2, 30),
dt.datetime(1970, 1, 1, 0, 7, 30)
]

编辑

一个数字示例,如果我有这个数字列表

numbers = [1,2,6,7]
delta = 1

我尝试对接近的值进行分组并获得该组的特征值(中心值)。增量是值之间的最大距离。

对于数字,特征值为

[1.5, 6.5]

因为这些值被分组在[1,2]和[6,7]中并计算平均值。

最佳答案

问题描述已经透露了这一点:您想使用 itertools 中的 groupby() 函数

所需要的只是一个稍微聪明一点的 key 函数,它会记住最后一个状态,并且只要连续的时间戳更接近,就会继续提供相同的 key 值比 delta 更接近。

分组后,将找到的组转换为平均时间,并考虑单个时间戳(包括示例)。

import datetime as dt
from itertools import groupby

dates = [
dt.datetime(1970, 1, 1, 0, 2),
dt.datetime(1970, 1, 1, 0, 3),
dt.datetime(1970, 1, 1, 0, 7),
dt.datetime(1970, 1, 1, 0, 8),
dt.datetime(1970, 1, 1, 0, 13)
]
delta = dt.timedelta(minutes=2)

class grouper:
def __init__(self, delta):
self.delta= delta
self.last = None

def __call__(self, tm):
# we keep on returning the same key as long as successive time
# stamps are within the last time stamp + delta
self.last = tm if (self.last is None) or (tm - self.last)>self.delta \
else self.last
return self.last

# transform the result of groupby into average times
def avgtm(item):
(key, tms) = item
tms = list(tms) # transform generator into list so we can index it
return tms[0] + (tms[-1]-tms[0])/2 if len(tms)>1 else tms[0]

timestamps = map(avgtm, groupby(dates, key=grouper(delta)))
print "Time stamps: ",timestamps

产量:

Time stamps:  [datetime.datetime(1970, 1, 1, 0, 2, 30), 
datetime.datetime(1970, 1, 1, 0, 7, 30),
datetime.datetime(1970, 1, 1, 0, 13)]

关于python - 按 timedelta 减少日期时间列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29683130/

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