Субстрактные даты без учета указанных c дней - PullRequest
0 голосов
/ 09 января 2020

Я хочу вычесть даты, игнорируя указанные c дни (не только выходные, но и некоторые другие дни, поэтому Подсчет количества дней между датами, игнорирование выходных в этом случае не работает).

Учитывая таблицу, в которой указывается, должен ли день считаться или нет, как я могу реализовать вспомогательную функцию, которая игнорирует эти дни?

data = {'Date':['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04'], 'key':[0, 0, 1, 0]}
df = pd.DataFrame(data)

Если ключ == 1, то день не должен учитываться ( как выходной день в аналогичной задаче)

from datetime import datetime

date1 = datetime.strptime('2019-01-02 21:00:00', '%Y-%m-%d %H:%M:%S')
date2 = datetime.strptime('2019-01-04 17:00:00', '%Y-%m-%d %H:%M:%S')

date2-date1
Out[50]:
datetime.timedelta(days=1, seconds=72000)

Ожидаемый результат: substract_function (date2, date1) должен вернуть 72000 секунд

1 Ответ

1 голос
/ 09 января 2020

Надеюсь, это то, что вы ищете.

import pandas as pd
from datetime import datetime, timedelta

df = pd.DataFrame({
    'Date':['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04'],
    'key':[0, 0, 1, 0]
    })

# transform df Dates to datetime type
df['Date'] = pd.to_datetime(df['Date']) 

# create list of the dates to be excluded
excl_dates_list = df.query('key==1').Date.to_list() 

# input dates to count the range
date1 = datetime.strptime('2019-01-02 21:00:00', '%Y-%m-%d %H:%M:%S')
date2 = datetime.strptime('2019-01-04 17:00:00', '%Y-%m-%d %H:%M:%S')

# the substraction function:
def substract_function(date2,date1):
    # if the first day is to be excluded, change it to the next day and start from 00:00 (so that 0 seconds are captured for this first day)
    if date1.date() in excl_dates_list:
        date1 = date1.replace(hour=0, minute=0, second=0) + timedelta(days=1)

    # if the last day is to be excluded, change it so it starts from 00:00 (so that 0 seconds are captured for this last day)
    if date2.date() in excl_dates_list:
        date2 = date2.replace(hour=0, minute=0, second=0)

    # count how many whole days between start and end should be excluded
    whole_days_to_exclude = len([x for x in excl_dates_list if (x>date1.date()) & (x<date2.date())])

    # return the substraction minus the number of days to be excluded
    return (date2-date1) - timedelta(days=whole_days_to_exclude)

substract_function(date2,date1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...