2
votes

Obtenez l'année fiscale en fonction de l'horodatage actuel-python

J'essaie d'obtenir la date de début de l'exercice en fonction de la date du jour.

Donc après quelques recherches, j'ai trouvé ce package appelé fiscalyear code> où vous pouvez modifier la date de début de l'exercice. Dans mon cas, je voulais que 01-07-year soit la date de début de mon exercice, donc j'ai défini fiscalyear.START_MONTH = 7 p>

J'ai essayé ce qui suit (exemple reproductible si vous pip install fiscallyear ):

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'))

Qui sort correctement:

'2018-07-01'

Cependant, cela ne fonctionnerait pas lorsque le mois passe à août, car datetime.datetime.now (). year ne change pas. J'ai donc essayé de faire quelque chose comme:

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

J'ai un mauvais pressentiment à propos de ce que je fais car cela pourrait maintenant fonctionner pendant des années bissextiles également.

Y a-t-il une meilleure façon de faire cela en python qui détectera la date de début de l'exercice en fonction de l'horodatage actuel?

version py : 3.6.7


1 commentaires

Que signifie " Cependant, cela ne fonctionnerait pas lorsque le mois passe à août "? De quel mois parlez-vous? Actuel ou fiscallyear.START_MONTH ?


4 Réponses :


1
votes

Je pense que vous avez besoin de searchsorted avec assistant 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


2 commentaires

Merci @jez, cependant, la sortie que je recherche n'est pas une série ou une dataframe, c'est une sortie de chaîne unique.


@ anky_91 - change x en scalaire (r [r.searchsorted (x) -1] + pd.Timedelta (1, 'd')



0
votes

Prenant un exemple de dataframe:

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

... J'ai utilisé pd.Grouper () pour les regrouper à partir du 1er juillet, où la clé est AS-JUL ie 'annuel à partir de juillet'

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

Vous pouvez voir ici que 2018-07-01 reste comme 2018-07 -01 après l'opération


0 commentaires

4
votes

Mes connaissances dans le domaine fiscal sont quelque part proches de 0 , mais selon [ReadTheDocs]: documentation fiscale :

La classe FiscalYear fournit un objet pour stocker des informations sur le début et la fin d'un exercice particulier.

...

Le début et la fin de chaque trimestre sont stockés en tant qu'instances de la classe FiscalDateTime . Cette classe fournit tous les mêmes fonctionnalités que la classe datetime , avec l'ajout de la possibilité d'interroger l'année fiscale et le trimestre

Donc, FiscalYear ne doit pas être utilisé avec des dates, mais FiscalDateTime (ou son frère plus simple: FiscalDate ) à la place.

>>> 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 commentaires

3
votes

Vous pouvez essayer le code suivant, cela a fonctionné pour moi:

>>> import fiscalyear
>>> fiscalyear.START_MONTH = 4
>>> fiscalyear.FiscalYear.current()
FiscalYear(2021)
>>> 


0 commentaires