0

我可以借用某人的大脑来解决这个问题。我有数据及其相关的时间戳。我有兴趣按 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

希望有道理...

4

3 回答 3

2

转换为秒,除以 300 并使用整数部分作为分组。

于 2013-04-03T17:52:55.807 回答
0
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还将期望一个排序列表
  • 如果您在分组中需要更多分辨率,只需修改 lambda 返回的元组

这里的关键是将分钟数除以 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)]
于 2013-04-03T17:55:51.173 回答
0

尝试将您的时间四舍五入到最接近的 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;
    }

希望好用,一切顺利

于 2013-04-03T22:43:02.763 回答