我有一些包含开始和结束时间的数据(日期时间格式),我想根据更受限制的日期范围计算持续时间。但到目前为止,我还没有成功。 (仍然非常喜欢python的业余爱好者。)
示例:John Doe住在123 Main St,从1990-01-01T00:00:00.0到2016-12-31T23:59:59.0,但我想知道他在2015年10月到12月期间住了多少小时。
下面的代码会成功计算小时数,但我无法成功过滤日期时间,因此我只能在2015年10月1日到2015年12月31日之间获得数小时。
from datetime import datetime
# The getValue function retrieves the datetime values from the table
time1str = getValue("START_DT_TM")
time2str = getValue("STOP_DT_TM")
# Intended date range
# periodstart = datetime.strptime("2015-10-01T00:00:00.0", '%Y-%m-%dT%H:%M:%S.%f')
# periodend = datetime.strptime("2015-12-31T23:59:59.0", '%Y-%m-%dT%H:%M:%S.%f')
time1 = datetime.strptime(time1str, '%Y-%m-%dT%H:%M:%S.%f')
time2 = datetime.strptime(time2str, '%Y-%m-%dT%H:%M:%S.%f')
timen = datetime.strptime(nowstr, '%Y-%m-%d %H:%M:%S.%f')
timef = (time2-timen).days*24
if timef > 0:
delta = timen - time1
seconds = delta.seconds/1440
days = delta.days*24
return str(days+seconds)
else:
delta = time2 - time1
seconds = delta.seconds/1440
days = delta.days*24
return str(days+seconds)
答案 0 :(得分:1)
你需要做两件事:
确定您的范围是否需要调整;如果有人在10月1日之前没有搬到这个地方,那么你需要选择他们确实开始在房子里生活的日期。这同样适用于结束日期。
然后计算开始日期和结束日期之间的小时数(根据需要调整)。考虑到这可能是0!
我在这里忘记将值转换为datetime
个对象;你已经正确地解决了这个问题。因此,time1
和time2
是一个人居住在某个地址的开始和结束时间,periodstart
和periodend
是您想知道其数量的边界时间:
# Adjust the start, pick the later value
periodstart = max(periodstart, time1)
# Adjust the end, pick the earlier value
periodend = min(periodend, time2)
duration = periodend - periodstart
hours = duration.total_seconds() // 3600
我在此处使用timedelta.total_seconds()
method而不是.days
属性,以确保您在一小时内纳入一天的持续时间分数。
演示:
>>> from datetime import datetime, timedelta
>>> time1, time2 = datetime(1990, 1, 1, 0, 0), datetime(2016, 12, 31, 23, 59, 59)
>>> periodstart, periodend = datetime(2015, 10, 1, 0, 0), datetime(2015, 12, 31, 23, 59, 59)
>>> periodstart = max(periodstart, time1)
>>> periodend = min(periodend, time2)
>>> duration = periodend - periodstart
>>> duration
datetime.timedelta(91, 86399)
>>> duration.total_seconds() // 3600
2207.0
当time1
或time2
落入期间时,这仍然适用:
>>> from datetime import timedelta
>>> time1 = periodstart + timedelta(days=25) # moved in after the periodstart date
>>> periodstart = max(periodstart, time1)
>>> periodend = min(periodend, time2)
>>> duration = periodend - periodstart
>>> duration.total_seconds() // 3600
1607.0
>>> time1, time2 = datetime(1990, 1, 1, 0, 0), datetime(2016, 12, 31, 23, 59, 59)
>>> periodstart, periodend = datetime(2015, 10, 1, 0, 0), datetime(2015, 12, 31, 23, 59, 59)
>>> time2 = periodend - timedelta(days=42) # moved out before periodend
>>> periodstart = max(periodstart, time1)
>>> periodend = min(periodend, time2)
>>> duration = periodend - periodstart
>>> duration.total_seconds() // 3600
1199.0
答案 1 :(得分:0)
我使用这种方法来计算一段时间内的工作日(从星期一到星期五)。
from datetime import date, timedelta
def working_days(fromdate, todate):
daygenerator = (fromdate + timedelta(x + 1) for x in xrange((todate - fromdate).days))
return sum(1 for day in daygenerator if day.weekday() < 5)
print working_days(date(2018,01,10), date(2018,11,09))
也许以这种方式改变方法可以起作用,你只需要将结果乘以* 24即可获得小时数:
def working_days(fromdate, todate):
daygenerator = (fromdate + timedelta(x + 1) for x in xrange((todate - fromdate).days))
return sum(1 for day in daygenerator)
我还是初学者,所以可能有人会以更好的方式帮助你。