Расчет длины квартала в pandas. Период - PullRequest
2 голосов
/ 05 августа 2020

Пример кода:

months = [Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sept, Oct, Nov, Dec]
months = pd.period_range(start='2020-01', periods=12, freq='M')

for start, end in zip(months, months[11:]):

end_q = end.qyear

print(start, end, end_q)

# Output:
2020-01 2020-12 2020

Этот код возвращает окно с 12 месяцами (начало, конец) и последней четвертью окна (end_q).

Мой вопрос: как могу ли я измерить процент end_q во всем окне (начало, конец)?

Я знаю, как измерить дни первого месяца в окне с помощью:

  first_month = start.month

  # number of days in first month (e.g., Jan)
  first_month_days = start.days_in_month

Сейчас Мне интересно, как я мог измерить последние три месяца окна, любые предложения приветствуются! Спасибо!

EDIT

Пример результата (обратите внимание, я предполагаю, что каждый месяц для простоты состоит из 30 дней):

  • Если размер окна составляет 12 месяцев (360 дней), а последний квартал (октябрь, ноябрь, декабрь c) состоит из 90 дней, результат должен быть: 90/360 = 0,25
  • Если windows размер составляет 15 месяцев (450), а последний квартал (в размере окна) теперь будет январь, февраль, март (следующего года), результат должен быть: 90/450 = 0,2

1 Ответ

1 голос
/ 05 августа 2020

Чтобы получить диапазоны для кварталов, вы можете сделать следующее, чтобы посмотреть на числа, кратные тройкам, которые могут динамически смотреть на несколько лет:

n = 3
months = pd.period_range(start='2020-01', periods=12, freq='M')    
for i in range(len(months)):
    if i%n == 0:
        print(months[i], months[i+2], months[i+2].qyear, n/len(months))

2020-01 2020-03 2020 0.25
2020-04 2020-06 2020 0.25
2020-07 2020-09 2020 0.25
2020-10 2020-12 2020 0.25

Этот метод в основном

Чтобы получить только в четвертом квартале (опять же, это будет работать в течение нескольких лет, предполагая, что период 12, 24, 36 месяцев и т. д. c. начинается в январе), вы можете сделать оператор if для октября, где оставшаяся часть (x+3)/12 равно 0, поэтому будет возвращено 9, 21, 33, et c. которые будут индексами для October за несколько лет:

n=3
months = pd.period_range(start='2020-01', periods=48, freq='M')
for i in range(len(months)):
    if i>0 and (i+n)%12 == 0:
        print(months[i], months[i+2], months[i+2].qyear, n/len(months))

2020-10 2020-12 2020 0.0625
2021-10 2021-12 2021 0.0625
2022-10 2022-12 2022 0.0625
2023-10 2023-12 2023 0.0625

Обратите внимание, что я могу указать periods=48 в приведенном выше коде. Если вы измените на periods=12, то вернется:

2020-10 2020-12 2020 0.25
...