我可以借用某人的大脑来解决这个问题。我有数据及其相关的时间戳。我有兴趣按 5 分钟的频率对它们进行分组,但是我只能以 00:00 格式开始分组。我的意思是 13:23:27(小时)需要与 13:25:00 数据分组,然后是 13:30:00、13:35:00 等
你知道我怎么能区分这个四舍五入吗?目前我可以按 5 分钟分组,但它从第一个时间戳开始,可能是 13:18:47,所以下一个给我的是 13:24:00,根据我想看到的定义,这是错误的13:20:00
希望有道理...
转换为秒,除以 300 并使用整数部分作为分组。
times = [<a list of datetimes>]
timegroups = [list(group) for (key, group) in
itertools.groupby(times, lambda t:(t.hour, t.minute // 5))]
import itertools
.//
是地板除法(尽管 SO 的语法高亮显示它认为这是一个注释)itertools.groupby
将返回一个依赖于原始迭代器的迭代器,如果需要,您可以使用它循环。我将其转换为列表,以便您可以轻松查看结果。groupby
还将期望一个排序列表这里的关键是将分钟数除以 5——这将实现您正在寻找的分组;这一条语句就是您需要的所有逻辑。
为了做(当前)接受的问题正在做的事情,这是需要的更改:
rounding_delta = datetime.timedelta(seconds=150)
def key_func(val):
t = val + rounding_delta
return (t.hour, t.minute // 5)
timegroups = [list(group) for (key, group) in
itertools.groupby(times, key_func)]
尝试将您的时间四舍五入到最接近的 300 秒。您可以使用舍入整数的内置函数。您也可以尝试使用此算法:
function round(int timestamp){
int N = timestamp; //The time in time stamp
int RN; //The rounded off time stamp -- wch is our answer
int n = 300; //5 min interval in seconds
int r = N%n; //The remainder
int x=N/n; //the whole number we get after dividing
if(r/n < 0.5){
RN = x * n;
}
else{
RN = (x * n)+5;
}
return RN;
}
希望好用,一切顺利