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 que01-07-yearsoit la date de début de mon exercice, donc j'ai définifiscalyear.START_MONTH = 7p>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 (). yearne 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
4 Réponses :
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
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')
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
Mes connaissances dans le domaine fiscal sont quelque part proches de 0 , mais selon [ReadTheDocs]: documentation fiscale :
La classe
FiscalYearfournit 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 classedatetime, 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
Vous pouvez essayer le code suivant, cela a fonctionné pour moi:
>>> import fiscalyear >>> fiscalyear.START_MONTH = 4 >>> fiscalyear.FiscalYear.current() FiscalYear(2021) >>>
Que signifie " Cependant, cela ne fonctionnerait pas lorsque le mois passe à août "? De quel mois parlez-vous? Actuel ou
fiscallyear.START_MONTH?