【问题标题】:Finding time range of imputed time interval in Python在Python中查找估算时间间隔的时间范围
【发布时间】:2019-11-08 10:23:56
【问题描述】:

我想创建一个函数,它将采用 start_timeend_time 并找到适合这些时间的时间间隔。 时间范围必须是每 5 分钟一次,但估算的时间间隔可以是任何其他时间。

我有这些间隔(我用下面的函数制作它们):

00:00:00
00:05:00
00:10:00
00:15:00
00:20:00
00:25:00
00:30:00
00:35:00
00:40:00
00:45:00
00:50:00
00:55:00

import datetime
import pandas as pd
import time

# creating time intervals at every 5 minutes
def find_interval(start_time, end_time):
    start_time = "00:00:00"
    end_time = "0:59:59"

    start = datetime.datetime.strptime(start_time,  '%H:%M:%S')
    end = datetime.datetime.strptime(end_time, '%H:%M:%S')
    step = datetime.timedelta(minutes=5)

    time_intervals = []

    while start <= end:
        time_intervals.append(start.time())
        #print(start.time())
        start += step

    #print(time_intervals)

我应该怎么做,这样当用户输入start_timeend_time时, 例如00:13:2400:22:41,我得到结果: [00:10:00, 00:15:00, 00:20:00, 00:25:00]

【问题讨论】:

  • 这些是时间,而不是间隔。间隔有开始和结束。
  • 您是否考虑使用pd.date_range
  • 你能解释一下吗?
  • 也许pd.timedelta_range 更好。我会给你一个答案。

标签: python


【解决方案1】:

一种完全不同的方法,基于@rpanai's answerpd.date_range

import pandas as pd
import datetime

intervals = pd.date_range('00:00', '01:00:00', freq='5min').time

start_time, end_time = "00:13:24", "00:22:41"
start = (datetime.datetime.strptime(start_time, '%H:%M:%S') - datetime.timedelta(minutes=5)).time()
end = (datetime.datetime.strptime(end_time, '%H:%M:%S') + datetime.timedelta(minutes=5)).time()

print(intervals[(intervals >= start) & (intervals <= end)].astype(str))

输出:

['00:10:00' '00:15:00' '00:20:00' '00:25:00']

【讨论】:

    【解决方案2】:

    您应该考虑的唯一事情是如何将00:13:41 转换为00:10:0000:22:41 转换为00:25:00

    import pandas as pd
    
    # this function round to previous or next 5M
    def round5M(tm, PoN):
        PoN = 0 if PoN is "previous" else 1
        return "00:{:02}:00".format((int(tm[3:5])//5 + PoN) * 5)
    
    start_time = "00:13:24"
    end_time = "00:22:41"
    
    out = pd.timedelta_range(start=round5M(start_time, "previous"),
                             end=round5M(end_time, "next"),
                             freq="5T")\
            .astype(str)\
            .to_list()
    
    
    print(out)
    ['00:10:00', '00:15:00', '00:20:00', '00:25:00']
    

    【讨论】:

    • 这太棒了!
    • @Adam.Er8 谢谢。我对round5M 不太满意,我希望有更好的方法来做同样的事情。
    • 我有一个想法,使用pd.date_range 实际构建完整的区间列表,并使用熊猫条件对其进行“查询”
    • @Adam.Er8 我想有人可以玩类似df['time'].dt.round('15min') 显示here
    • 如果你导入它,你最好把它的所有汁液都拿走。
    【解决方案3】:

    试试这个:

    import datetime
    import time
    
    
    # creating time intervals at every 5 minutes
    def create_intervals():
        start_time = "00:00:00"
        end_time = "0:59:59"
    
        start = datetime.datetime.strptime(start_time, '%H:%M:%S')
        end = datetime.datetime.strptime(end_time, '%H:%M:%S')
        step = datetime.timedelta(minutes=5)
    
        time_intervals = []
    
        while start <= end:
            time_intervals.append(start.time())
            # print(start.time())
            start += step
        return time_intervals
    
    
    def find_intervals(start_time, end_time, intervals):
        start = datetime.datetime.strptime(start_time, '%H:%M:%S').time()
        end = datetime.datetime.strptime(end_time, '%H:%M:%S').time()
    
        first = next(i for i, v in enumerate(intervals) if start <= v) - 1
        last = next(i for i, v in enumerate(intervals) if end <= v) + 1
    
        return intervals[first:last]
    
    
    intervals = create_intervals()
    
    result = [str(i) for i in find_intervals("00:13:24", "00:22:41", intervals)]
    print(result)
    
    

    我正在使用您的函数来创建间隔列表,然后从输入时间中我找到“覆盖”输入时间的第一次和最后一次,并返回它们。

    为了以您要求的格式打印,我将datetime.time 对象转换为str

    输出:

    ['00:10:00', '00:15:00', '00:20:00', '00:25:00']

    【讨论】:

    • 非常感谢,您能说说您为什么使用nextnext 是做什么用的吗?
    • 它就像for 的单次迭代,我用它来获取第一个匹配条件的元素,而不必创建整个列表并选择第一个元素(这可能是内存问题列表很大)
    • 从这个答案中得到它:stackoverflow.com/questions/2361426/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多