日期时间范围内的Python过滤器?

时间:2017-02-18 17:03:52

标签: python datetime

我有一些包含开始和结束时间的数据(日期时间格式),我想根据更受限制的日期范围计算持续时间。但到目前为止,我还没有成功。 (仍然非常喜欢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)

2 个答案:

答案 0 :(得分:1)

你需要做两件事:

  • 确定您的范围是否需要调整;如果有人在10月1日之前没有搬到这个地方,那么你需要选择他们确实开始在房子里生活的日期。这同样适用于结束日期。

  • 然后计算开始日期和结束日期之间的小时数(根据需要调整)。考虑到这可能是0!

我在这里忘记将值转换为datetime个对象;你已经正确地解决了这个问题。因此,time1time2是一个人居住在某个地址的开始和结束时间,periodstartperiodend是您想知道其数量的边界时间:

# 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

time1time2落入期间时,这仍然适用:

>>> 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)

我还是初学者,所以可能有人会以更好的方式帮助你。