Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,如何将带有特定时间戳的持续时间输入到BIN中?_Python_Datetime - Fatal编程技术网

在python中,如何将带有特定时间戳的持续时间输入到BIN中?

在python中,如何将带有特定时间戳的持续时间输入到BIN中?,python,datetime,Python,Datetime,我对python还相当陌生,我正在寻找一种在指定的容器中组织时间的有效方法。我有一张有[开始时间]和[持续时间]的桌子。我想根据此表填写每个小时间隔所花费的时间。 如果我有这张桌子 start_time duration 12:25 1:00 13:35 0:15 14:03 0:20 15:40 0:10 16:15 1:05 17:30 0:40 那么预期的输出是 bins

我对python还相当陌生,我正在寻找一种在指定的容器中组织时间的有效方法。我有一张有[开始时间]和[持续时间]的桌子。我想根据此表填写每个小时间隔所花费的时间。 如果我有这张桌子

start_time  duration
12:25         1:00
13:35         0:15
14:03         0:20
15:40         0:10
16:15         1:05
17:30         0:40
那么预期的输出是

    bins          time
12:00 - 13:00     0:35
13:00 - 14:00     0:40
14:00 - 15:00     0:20
15:00 - 16:00     0:10
16:00 - 17:00     0:45
17:00 - 18:00     0:50
18:00 - 19:00     0:10
19:00 - 20:00     0:00
如果您能在这项任务上提供帮助,我将不胜感激!:)

我不久前编写的库在这方面可能很有用:

from ranges import Range, RangeSet
from datetime import datetime, timedelta
from functools import reduce

# times, transcribed from above
# and converted to datetimes (so that we can use timedelta math)
times = [
    (datetime(1, 1, 1, 12, 25), timedelta(hours=1)),     # (12:25, 1:00),
    (datetime(1, 1, 1, 13, 35), timedelta(minutes=15)),  # (13:35, 0:15),
    (datetime(1, 1, 1, 14, 3),  timedelta(minutes=20)),  # (14:03, 0:20),
    (datetime(1, 1, 1, 15, 40), timedelta(minutes=10)),  # (15:40, 0:10),
    (datetime(1, 1, 1, 16, 15), timedelta(minutes=65)),  # (16:15, 1:05),
    (datetime(1, 1, 1, 17, 30), timedelta(minutes=40)),  # (17:30, 0:40),
]

# make a RangeSet that encompasses the entire day
wholeDay = RangeSet(Range(datetime(1, 1, 1, 12, 00), datetime(1, 1, 1, 20, 00)))

# remove our times from the whole day
wholeDay -= [Range(start, start + duration) for (start, duration) in times]

# get a list of correspondences with timedeltas
bins = {}
for h in range(12, 20):
    # create the 1-hour-long range
    period = Range(datetime(1, 1, 1, h), datetime(1, 1, 1, h + 1))
    # compute number of minutes in this range *were consumed* during the whole day
    # which is the same as the number of minutes in this period that are not contained in wholeDay
    #   (in other words, the length of the set difference)
    # We have to do this roundabout counting-second method, 
    #   because timedelta() doesn't work with sum() natively
    time_seconds = sum(rng.length().seconds for rng in period.difference(wholeDay))
    # finally, add to dict
    bins[period] = timedelta(seconds=time_seconds)
这将产生以下

{Range[datetime.datetime(1, 1, 1, 12, 0), datetime.datetime(1, 1, 1, 13, 0)): datetime.timedelta(seconds=2100),
 Range[datetime.datetime(1, 1, 1, 13, 0), datetime.datetime(1, 1, 1, 14, 0)): datetime.timedelta(seconds=2400),
 Range[datetime.datetime(1, 1, 1, 14, 0), datetime.datetime(1, 1, 1, 15, 0)): datetime.timedelta(seconds=1200),
 Range[datetime.datetime(1, 1, 1, 15, 0), datetime.datetime(1, 1, 1, 16, 0)): datetime.timedelta(seconds=600),
 Range[datetime.datetime(1, 1, 1, 16, 0), datetime.datetime(1, 1, 1, 17, 0)): datetime.timedelta(seconds=2700),
 Range[datetime.datetime(1, 1, 1, 17, 0), datetime.datetime(1, 1, 1, 18, 0)): datetime.timedelta(seconds=3000),
 Range[datetime.datetime(1, 1, 1, 18, 0), datetime.datetime(1, 1, 1, 19, 0)): datetime.timedelta(seconds=600),
 Range[datetime.datetime(1, 1, 1, 19, 0), datetime.datetime(1, 1, 1, 20, 0)): datetime.timedelta(0)}
这是您的预期输出,由
datetime
s表示