2017-02-18 15 views
-1

У меня есть данные с начальным и конечным временем в нем (формат даты и времени), и я хочу рассчитать продолжительность в часах на основе более ограниченного диапазона дат. Но до сих пор я не увенчалась успехом. (Все еще очень любитель с питоном.)Фильтр Python в диапазоне datetime?

Пример: Джон Доу жил в 123 Main St с 1990-01-01T00: 00: 00.0 до 2016-12-31T23: 59: 59.0, но я хочу знать, как много часов он жил там в период с октября по декабрь 2015 года.

Код ниже будет успешно вычислять часы, но я не смог успешно фильтровать данные, так что я получаю часы только между датами 1 октября 2015 года и 31 декабря 2015 года.

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 окт 2015 и 31 дек 2015 ? Для любого диапазона вам просто нужно определить верхний и нижний предел с помощью простых сравнений, а затем найти количество часов в этом диапазоне, как вы только что сделали –

+0

Я должен был быть более ясным. Проблема в том, что в данных, с которыми я работаю, существует несколько длительностей, перекрывающих диапазон (1 октября - 31 декабря).Итак, чтобы использовать тот же пример, рассмотрите четыре разных случая: Адам живет там до периода, но уходит в течение периода; Боб начинает жить там после начала периода, но уходит до окончания периода; Крис начинает жить там после начала периода, но уходит после окончания периода; и Дейв живет там до и после окончания периода. Мне нужно уметь рассчитать продолжительность пребывания каждого человека в пределах диапазона. –

ответ

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) 

Я еще новичок, так что, вероятно, кто-то поможет в лучшем виде.

1

Вы должны сделать две вещи:

  • Определите, если ваш диапазон регулировки необходимо; если кто-то не переместился на место до 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 
+0

Я не уверен, почему именно, но это возвращает неправильный результат. Это дает мне полную продолжительность того, как долго X жил на месте Y, а не только, как долго он жил там в диапазоне от 1 октября до 31 декабря. Итак, я должен получить результат (примерно) от 0 до 92 дней (или эквивалент в часах), но вместо этого он дает мне (например) 3000 дней, потому что в целом он прожил там несколько лет. –

+0

@BrianDonohue: кроме того, что вы вычитали «период» и 'periodstart', я получаю правильный ответ (2207 часов) для ваших данных. –