1
votes

Afficher / renvoyer les 12 et 24 derniers mois avec l'année du mois en cours et de l'année en utilisant python

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 >


0 commentaires

4 Réponses :


1
votes

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.


1 commentaires

merci, veuillez voter pour cette question, sinon je ne serai pas autorisé à poser des questions



1
votes

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.


3 commentaires

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



0
votes

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 >


0 commentaires

0
votes

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.


0 commentaires