如何从这两个对象生成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
类似的东西。
答案 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
参数在您的情况下为24
,step
为1
(小时)。
然后您将使用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))