Pandas Datetime: разделение даты начала и окончания на n-месячные сгибы - PullRequest
0 голосов
/ 11 марта 2020

Предположим, у вас есть два pandas datetime: from_date и end_date. Мне нужна функция, которая разбивает ее на сгибы n месяцев (скажем, n=3). Например:

import pandas as pd

from_date = pd.to_datetime("2020-02-15")
to_date = pd.to_datetime("2020-05-20")

следует разбить на 2 сгиба:

{
"1": {"from_date": 2020-02-15, "to_date": 2020-05-15}, 
"2": {"from_date": 2020-05-16, "to_date": 2020-05-20}
}

каждый сгиб должен удовлетворять условию: from_date + pd.DateOffset(months=2) >= end_date. Таким образом, речь идет не о количестве дней между начальной и конечной датой.

Какой самый питонный c способ сделать это? Что-то есть в pandas?

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Мое решение:

import pandas as pd

def check_and_split(from_date, to_date):
    from_date = pd.to_datetime(from_date)
    to_date = pd.to_datetime(to_date)

    done = False
    fold = 0
    result = {}

    start = from_date
    end = to_date

    while not done:
        if start + pd.DateOffset(months=2) > to_date:
            done = True
            end = to_date
        else:
            end = start + pd.DateOffset(months=3)

        result[fold] = {"from_date": start, "to_date": end}

        if not done:
            start = end + pd.DateOffset(days=1)
            fold += 1

    return result

Разве нет более подходящего пути pythoni c? Что-то в pandas может быть?

0 голосов
/ 11 марта 2020

Замените соответствующие операторы печати в соответствии с тем, как вы sh используете 2 даты!

Согласно Как рассчитать дату шесть месяцев от текущей даты с использованием модуля datetime Python? , dateutil.relativedelta может помочь разрешить эти месяцы с 31-м днем ​​и без него!

import pandas as pd
from dateutil.relativedelta import relativedelta

from_date = pd.to_datetime("2020-02-15")
to_date = pd.to_datetime("2020-05-20")
fold = 0
result = {}


while from_date+relativedelta(months=+3)<to_date:
    curfrom = from_date #retain current 'from_date'
    from_date =from_date+relativedelta(months=+3)
    result[fold] = {"from_date": curfrom, "to_date": from_date}
    fold = fold+1
    from_date = from_date + relativedelta(days=+1) #So that the next 'from_date' starts 1 day after
result[fold] = {"from_date": curfrom, "to_date": to_date}

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