繁体   English   中英

在 python 中的时间范围内的时间分布为 datetime.time

[英]distribution of hours between a time range as datetime.time in python

我有两次,我想使用 Python 中的相同格式列出它们之间的所有时间。

正如我所拥有的

start_time: 08:00:00
end_time: 13:00:00

我想列出他们之间的小时数。 从头到尾都是这样(08:00:00 - 13:00:00)。

[
 {
  start: 08:00:00,
  end: 09:00:00
 },
 {
  start: 09:00:00,
  end: 10:00:00
 },
 {
  start: 10:00:00,
  end: 11:00:00
 },
 {
  start: 11:00:00,
  end: 12:00:00
 },
 {
  start: 12:00:00,
  end: 13:00:00
 }
]

一小时范围分布设置在一个时间范围之间。 我正在使用 pandas 但它在日期分配方面非常方便,但无法按时应用。 我想知道 python 中的有效方法是什么。

这应该有效,可能不是最有效的

start_time= datetime.strptime('08:00:00','%H:%M:%S')
end_time= datetime.strptime('13:00:00','%H:%M:%S')
[{'start':start_time.replace(hour=i),'end':start_time.replace(hour=i+1)} for i in range(start_time.hour,end_time.hour)]

Output:

[{'start': datetime.datetime(1900, 1, 1, 8, 0),
  'end': datetime.datetime(1900, 1, 1, 9, 0)},
 {'start': datetime.datetime(1900, 1, 1, 9, 0),
  'end': datetime.datetime(1900, 1, 1, 10, 0)},
 {'start': datetime.datetime(1900, 1, 1, 10, 0),
  'end': datetime.datetime(1900, 1, 1, 11, 0)},
 {'start': datetime.datetime(1900, 1, 1, 11, 0),
  'end': datetime.datetime(1900, 1, 1, 12, 0)},
 {'start': datetime.datetime(1900, 1, 1, 12, 0),
  'end': datetime.datetime(1900, 1, 1, 13, 0)}]

你可以做:

注意:我假设您的 start_time、end_time 是字符串

from datetime import datetime
from datetime import timedelta 
f = '%H:%M:%S'
begin = datetime.strptime(start_time, f)
end = datetime.strptime(end_time, f)
duration = ((end-begin).seconds) // 3600
out = [{'start': (begin + timedelta(hours=i)).strftime(f),
       'end': (begin + timedelta(hours=i + 1)).strftime(f)} for i in
       range(duration)]

打印出):

[{'start': '08:00:00', 'end': '09:00:00'},
 {'start': '09:00:00', 'end': '10:00:00'},
 {'start': '10:00:00', 'end': '11:00:00'},
 {'start': '11:00:00', 'end': '12:00:00'},
 {'start': '12:00:00', 'end': '13:00:00'}]

使用

start_time = '08:00:00'
end_time = '13:00:00'

s = pd.Series(pd.date_range(start_time, end_time, freq='H')
                .strftime('%H:%M:%S'))

out = (pd.DataFrame({'start': s, 'end':s.shift(-1)})
       .iloc[:-1]
       .to_dict('records')
       )

output:

[{'start': '08:00:00', 'end': '09:00:00'},
 {'start': '09:00:00', 'end': '10:00:00'},
 {'start': '10:00:00', 'end': '11:00:00'},
 {'start': '11:00:00', 'end': '12:00:00'},
 {'start': '12:00:00', 'end': '13:00:00'}]

您可以轻松地推广到任何频率。 例如freq='2.5H' / freq='150min'

[{'start': '08:00:00', 'end': '10:30:00'},
 {'start': '10:30:00', 'end': '13:00:00'}]

您还可以使用pd.date_range

[{'start':(item - pd.Timedelta(hours=1)).strftime('%H:%M:%S') ,  'end':item.strftime('%H:%M:%S')} for item in list(pd.date_range('08:00:00', '13:00:00', freq='H'))[1:]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM