生成datetime.time对象python的数组

时间:2017-08-04 18:23:54

标签: python arrays datetime time

如何从这两个对象生成datetime.time个对象数组:

start = datetime.time(22, 0)
end   = datetime.time( 2, 0)

看起来像是:

interval = array([datetime.time(22,0), datetime.time(23,0), datetime.time(0,0),
                  datetime.time( 1,0), datetime.time( 2,0)])

修改

在此示例中,delta为hour = 1,但可能是分钟或秒。我正在寻找与pandas.date_range类似的东西。

4 个答案:

答案 0 :(得分:1)

使用numpy更新更短版本

import datetime
import numpy as np

def return_times(start,end):
    if start < end:
        return np.array([datetime.time(i,0) for i in range(start.hour,end.hour+1)])
    else:
        hours = list(range(24))
        nplist = np.array([datetime.time(i,0) for i in hours if i not in list(range(end.hour+1,start.hour))])
        return np.roll(nplist, -np.where(nplist==start)[0][0])

return_times(datetime.time(0,0),datetime.time(3,0)) # if-case 1
return_times(datetime.time(22,0),datetime.time(2,0)) # else-case

00:00 - &gt; 03:00

array([datetime.time(0, 0), datetime.time(1, 0), datetime.time(2, 0),
   datetime.time(3, 0)], dtype=object)
  

100000个循环,最佳3:每循环12.6μs

22:00 - &gt; 02:00

array([datetime.time(22, 0), datetime.time(23, 0), datetime.time(0, 0),
       datetime.time(1, 0), datetime.time(2, 0)], dtype=object)
  

10000次循环,最佳3次:每次循环79.9μs

update2 使用mod感谢SwiftsNamesake,这可以通过单个列表解析来解决

import datetime

def return_times(start,end):
    s  = start.hour
    e  = end.hour 
    hours = [i%24 for i in range(s, e+1 if e >= s else 24+e+1)]
    return [datetime.time(i,0) for i in hours]

return_times(datetime.time(0,0),datetime.time(3,0))
  

100000个循环,最佳3:3.75μs/循环

答案 1 :(得分:1)

您可以先使用modularRange函数生成所需的数字。生成器表达式使代码更短;我们可以使用for循环,加上yield

def modularRange(start, end, step, mod):
  return (i % mod for i in range(start, end + 1 + (0 if end >= start else mod), step))

你也可以在上限中作弊,利用bool s int的核心事实:

range(start, end + 1 + mod*(end < start)

mod参数在您的情况下为24step1(小时)。

然后您将使用np.array构建数组,正如其他海报所示。

np.array([datetime.time(hour,0) for hour in modularRange(start.hour, end.hour, 1, 24)])

OP请求了几分钟的例子。下面的代码将以5分钟为间隔生成datetime.time个对象。我必须修改modularRange函数以考虑步骤。

startMin = start.hour * 60 + start.minute # Convert to minutes
endMin   = end.hour   * 60 + end.minute   # Convert to minutes
np.array([datetime.time(mins//60, mins%60) for mins in modularRange(startMin, endMin, 5, 24*60)])

答案 2 :(得分:0)

  

datetime.time([hour [,minute [,second [,microsecond [,tzinfo]]]]]) - &gt;时间对象

因此,如果你看一些attributes的{​​{1}}喜欢

datetime.time

您可以使用上述因素实施start.hour >>> 22 end.hour >>> 2 start.max >>> datetime.time(23, 59, 59, 999999) start.max.hour >>> 23

list

答案 3 :(得分:-1)

可以使用更简单的解决方案

T = np.arange(datetime.date(2019, 4, 13),datetime.date(2020, 4, 13))