Получить финансовый год на основе текущей метки-питона - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь получить дату начала финансового года на основе сегодняшней даты.

Поэтому после небольшого исследования я нашел этот пакет под названием fiscalyear, где вы можете изменить дату начала финансового года.В моем случае я хотел, чтобы 01-07-year была начальной датой моего финансового года, поэтому я установил fiscalyear.START_MONTH = 7

. Я попробовал следующее (воспроизводимый пример, если вы pip install fiscalyear):

import datetime
import fiscalyear
fiscalyear.START_MONTH = 7
a = fiscalyear.FiscalYear(datetime.datetime.now().year).start.date()
a.strftime('%Y-%m-%d')

Что выводит правильно:

'2018-07-01'

Однако это не будет работать, когда месяц переходит на август, так как datetime.datetime.now().year не меняется.Поэтому я попытался сделать что-то вроде:

if (datetime.datetime.now()-pd.to_datetime('2018-07-01')).days < 365:
    a = fiscalyear.FiscalYear(datetime.datetime.now().year).start.date()
    print(a.strftime('%Y-%m-%d'))
else:
    a = fiscalyear.FiscalYear(datetime.datetime.now().year+1).start.date()
    print(a.strftime('%Y-%m-%d'))

У меня плохое предчувствие, что я делаю, так как это может теперь работать и в високосные годы.

Есть ликакой-нибудь лучший способ сделать это в python, который будет определять дату начала финансового года на основе текущей метки времени?

py версия : 3.6.7

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Взяв примерный кадр данных:

pd.DataFrame(dict(
    dates=[pd.datetime(2018, 6, 1), pd.datetime(2018, 7, 1), pd.datetime(2018, 7, 2)],
    values=[0]*3
))

       dates  values
0 2018-06-01       0
1 2018-07-01       0
2 2018-07-02       0

... Я использовал pd.Grouper(), чтобы сгруппировать их до даты начиная с 1 июля, где ключом является AS-JUL, т.е.«годовой, начиная с июля»

df.groupby(pd.Grouper(freq='AS-JUL', key='dates')).count()
            values
            values
dates             
2017-07-01       1
2018-07-01       2

Здесь вы можете видеть, что 2018-07-01 остается как 2018-07-01 после операции

0 голосов
/ 19 февраля 2019

Мои знания в фискальной области где-то близки к 0 , но согласно [ReadTheDocs]: fiscalyear Документация :

Класс FiscalYear предоставляет объект для хранения информации о начале и конце конкретного финансового года.

...

Начало и конец каждого квартала сохраняются как экземплярыкласса FiscalDateTime.Этот класс предоставляет все те же функции, что и класс datetime, с добавлением возможности запрашивать финансовый год и квартал

Таким образом, FiscalYear неиспользовать с датами, но вместо этого FiscalDateTime (или его более простой брат: FiscalDate ).

>>> import fiscalyear
>>> fiscalyear.START_MONTH = 7
>>>
>>> cur_y = fiscalyear.FiscalYear(datetime.datetime.now().year)
>>> cur_y.start.date()
datetime.date(2018, 7, 1)
>>> cur_y.end.date()
datetime.date(2019, 6, 30)
>>>
>>> cur_dt = fiscalyear.FiscalDate(2019, 2, 19)  # Current date (at answer time)
>>> cur_dt.fiscal_year
2019
>>>
>>> jul_dt = fiscalyear.FiscalDate(2019, 7, 19)  # A date past July 1st (when the fiscal year should change)
>>> jul_dt.fiscal_year
2020
0 голосов
/ 19 февраля 2019

Я думаю, вам нужно searchsorted с помощником DatetimeIndex:

r = pd.to_datetime([f'{x}-06-30' for x in range(1970, 2021)])
#print (r)

for x in ['2017-07-01','2017-07-02','2018-06-30','2019-02-19','2019-08-19']:
    out = (r[r.searchsorted(pd.Timestamp(x))] + pd.Timedelta(1, 'd')).year
    print (out)
2018
2018
2018
2019
2020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...