Je veux créer une fonction qui prendra le mois en cours d'entrée et l'année en cours et donnera la sortie des 12 et 24 derniers mois avec des années,
par exemple, supposons que la fonction soit f,
XXX
Cette fonction renverra deux deux sorties
first output: [3,2,1,12,11,10,9,8,7,6,5,4] # last 12 months from current month i.e. 4 [2019,2019,2019,2018,2018,2018,2018,2018,2018,2018,2018,2018] # the years of corresponding months second output: [3,2,1,12,11,10,9,8,7,6,5,4,3,2,1,12,11,10,9,8,7,6,5,4] # last 24 months [2019,2019,2019,2018,2018,2018,2018,2018,2018,2018,2018,2018, 2018,2018,2018,2017,2017,2017,2017,2017,2017,2017,2017,2017] # years of above months
Comment le faire de la manière la plus efficace en python?
p >
4 Réponses :
Le moyen le plus efficace est d'éviter de faire vous-même le calcul des dates et d'utiliser dateutil
pour le faire à votre place.
>>> from dateutil import parser, relativedelta >>> d = parser.parse('2019-04-01') >>> d datetime.datetime(2019, 4, 1, 0, 0) >>> previous = [d - relativedelta.relativedelta(months=m) for m in range(1,13)] >>> previous [datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 2, 1, 0, 0), datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2018, 12, 1, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 10, 1, 0, 0), datetime.datetime(2018, 9, 1, 0, 0), datetime.datetime(2018, 8, 1, 0, 0), datetime.datetime(2018, 7, 1, 0, 0), datetime.datetime(2018, 6, 1, 0, 0), datetime.datetime(2018, 5, 1, 0, 0), datetime.datetime(2018, 4, 1, 0, 0)]
Pour obtenir 24 mois au lieu de 12, remplacez 25
par 13
dans la compréhension de la liste.
Vous trouverez probablement plus pratique de récupérer les datetime
depuis votre fonction plutôt que des entiers. Il est facile d'extraire la date et le mois d'une datetime
, le formatage est beaucoup plus pratique, et vous devrez probablement les reconvertir en datetime
s à un moment donné de toute façon.
merci, veuillez voter pour cette question, sinon je ne serai pas autorisé à poser des questions
Même si stackoverflow n'est pas réellement un service d'écriture de code ... cela devrait le faire:
([3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4], [2019, 2019, 2019, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018])
Le résultat est:
#!/usr/bin/env python # -*- coding: utf-8 -*- def f(month, year): m=range(12, 0, -1)*3 y=[year]*12+[year-1]*12 return m[13-month:(13-month+12)], y[13-month:(13-month+12)] print f(4, 2019)
Vous pouvez en dériver vous-même la version pendant deux ans.
J'obtiens l'erreur suivante: TypeError: type (s) d'opérande non pris en charge pour *: 'range' et 'int'
pour python3, utilisez plutôt m = list (range (12, 0, -1)) * 3
.
veuillez voter pour cette question, sinon je ne serai pas autorisé à poser des questions
Fonction:
[2019, 2019, 2019, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018] [3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4]
Code:
years_list, months_list = get_prev_month_date(2019, 4, 12)
Résultats:
import datetime import dateutil.relativedelta def get_prev_month_date(year, month, period): years, months = ([] for j in range(2)) for i in range(1, period+ 1): date = datetime.date(year, month, 3) months.append((date - dateutil.relativedelta.relativedelta(months=i)).month) years.append((date - dateutil.relativedelta.relativedelta(months=i)).year) return years, months
p >
Vous pouvez utiliser la bibliothèque «Pandas» pour définir la date du jour et votre objectif les mois précédents.
import pandas as pd today = pd.to_datetime('today').strftime("%d/%m/%Y") last = (pd.to_datetime(today) - pd.DateOffset(years=1)).strftime("%d/%m/%Y") listofmonths = pd.date_range(start=last, end=today, freq='MS')
Si vous souhaitez obtenir 24 mois, définissez années
sur 2.