1
votes

Comment obtenir le nom des mois précédents à partir de ou des numéros de forme complète en python / Django

Pardonne-moi si je pose des questions très stupides.

J'essaye d'obtenir le nom des mois passés au lieu des nombres mon framework django:

Exemple: Par exemple, si je avoir 12 , je veux retourner décembre ou décembre

En ce moment, j'avais ces scripts python externes qui trient le jour, les semaines, le mois et les années .

Voici les codes des scripts externes Nom; basicfun : (uniquement sur les mois)

Exception Type:AttributeError
Exception Value:'int' object has no attribute 'strftime'

Il reviendra à ma vue django à utiliser comme filtre pour Queryset

Ici, le cadre fonctionne sur les codes de la vue:

   dataset = datetime.now().month - 1
   dataset.strftime("%b") 

Solution que j'avais essayé

Ce lien: Obtenir le nom du mois à partir du numéro

1.

#Django view 
       def ph(request):
            query = request.GET.get('dateRange')
            fill = selectDates(query)
            data = tank_system.objects.all().filter(datetime__contains=fill)
            return render(request, 'FrounterWeb/extends/ph.html', {'tank': data})

erreur:

#basicfun codes (external python scripts)  

 def selectDates(query):

    if query == 'Previous-Months':
    dataset = datetime.now().month - 1
    dataset.strftime("%b")

 return dataset 


0 commentaires

3 Réponses :


3
votes

Votre erreur est due au fait que datetime.now (). month est un entier. strftime est une méthode sur l'objet datetime .

Vous pouvez obtenir le mois en cours en faisant:

month = datetime.now () .strftime ("% b")

Pour obtenir les noms des mois précédents, une manière simple mais "hacky" de le faire serait simplement de créer un dictionnaire des chaînes du mois que vous voulez avec le numéro du mois comme clés:

from datetime import datetime

def limit_month_number(start_month, months_ago):
    """
    This function will return a value from 1-12 inclusive.
    >>> limit_month_number(1,3) -> 10
    >>> limit_month_number(12,14) -> 10
    """
    month_number = start_month - (months_ago % 12)
    if month_number < 1:
        month_number = 12 + month_number 
    return month_number

def get_prev_month(months_ago):
    months = {1: 'Jan', 2: 'Feb', 10: 'Oct', 11: 'Nov', 12: 'Dec'}

    this_month = datetime.now().month

    month_number = limit_month_number(this_month, months_ago)

    prev_month = months[month_number]
    return prev_month

print(get_prev_month(2)) # 'Nov', two months ago from now

Aussi, je dois souligner que vous pouvez le faire en utilisant datetime . Consultez cet autre article: date python du mois précédent


5 commentaires

merci Kevin ça marche sur le mois en cours, car le mois précédent comme tu l'as dit est vraiment hacky


L'avantage d'utiliser votre propre dictionnaire est que vous avez le choix d'utiliser l'abréviation ou le nom complet du mois.


Je n'ai pas eu le mois dernier, mais ce mois-ci à la place, je me demande si le virage n'a pas fonctionné?


J'ai modifié le code. Essayez ça. Je vous laisse remplir vous-même les 7 autres mois.


@KevinWelch Vous pouvez réduire le «piratage» en utilisant le module calendrier de la bibliothèque standard pour fournir les noms de mois - voir les attributs month_name et month_abbr .



2
votes

Utilisez relativedelta .

>>> [(dt.date.today() - relativedelta(months=x)).strftime('%B') for x in range(3, 0, -1)]
['October', 'November', 'December']

Au cours des trois derniers mois, vous pouvez utiliser une compréhension de liste:

from dateutil.relativedelta import relativedelta

today = dt.date.today()  # 2019-01-03
>>> (today - relativedelta(months=1)).strftime('%B')  # `%b' for abbreviated month
'December'


1 commentaires

Avez-vous besoin d'installer relativedlta? car #from detutil.relativedelta import relativedelta # Django ne reconsidère pas



2
votes

Essayez ceci

previous_month = (datetime.date.today().replace(day=1) - datetime.timedelta(days=1)).strftime('%B')


0 commentaires