10
votes

Python: Nombre de la semaine dans un mois

Lorsque vous spécifiez une date: xxx pré>

Comment puis-je savoir que c'est la troisième semaine du mois? P>

Et si je veux ces dates?

datetime.datetime(2011, 2, 28) //should return 4
datetime.datetime(2011, 8, 29) //should return 5


4 commentaires

2011-8-15 ne serait-il pas la 3ème semaine du mois?


@Francisco - Quelle est votre définition de la nième semaine de février? Juste pour clarification Quelle est la date de date d'application de la 1ère semaine de février 2011? De nombreuses personnes disent réellement qu'il y a 5 semaines en février 2011 et que le 28 est la 5ème semaine.


Ma réponse sur cette question connexe devrait faire le travail: Stackoverflow.com/questions/3806473/...


Est-ce que cela répond à votre question? Python - Numéro de semaine du mois


9 Réponses :


2
votes

Peut-être http://labix.org/python-datetutil aidera.

autre que que ce n'est que des mathématiques. xxx


0 commentaires

11
votes
In [115]: d=datetime.datetime(2011, 2, 28)

In [116]: (d.day-1)//7+1
Out[116]: 4

In [117]: d=datetime.datetime(2011, 8, 29)

In [118]: (d.day-1)//7+1
Out[118]: 5

3 commentaires

@Usagi: Peut-être que je me trompe, mais comme 2011-2-28 devrait renvoyer 4 , j'ai pris la question de l'OP à signifier "donnée une date d < / Code> qui se produit sur le N 00 w du mois, comment trouvez-vous n ? ".


Je vois. Ouais c'est déroutant. L'OP devrait ajouter d'autres informations de base car, comme l'a souligné Paul, la définition de la nième semaine change la réponse.


@Mathia Haure-Touzé: Votre édition suggère une solution significativement différente du mien. Par conséquent, veuillez le poster comme votre propre réponse.



0
votes
testdate = datetime.datetime(2011, 2, 28)
weekofmonth = (testdate.day+7-1)/7
In general to find the ceiling of division: ceiling of (x/y) = (x+y-1)/y

2 commentaires

Pouvez-vous expliquer s'il vous plaît? Je pensais que c'était (28 + 7-1) / 7 = 34/7 = 4. Est-ce incorrect?


Regardez un calendrier pour octobre 2011. Aussi Paul explique ceci ci-dessous. Pour le 28 octobre 2011, la réponse devrait être de 5 et il y a six semaines totales en octobre 2011.



14
votes

L'approche modulo-style indiquée dans d'autres réponses peut être trompeuse. Imaginez des semaines dans un an. Il y a 52 morceaux de 7 jours de 365 jours, avec une journée à gauche. Donc, si pour ma première année, la 52e semaine se termine le 30 décembre et j'ai 11 décembre à craindre.

Je pourrais Soit EM> considère qu'il y a 53 semaines dans l'année et avoir La 53e semaine soit 31 décembre, le 1er janvier, le 2 janvier, 3 janvier ... ou, plus conventionnellement, je considère que la première semaine de la prochaine année commence le 31 décembre. C'est ainsi que votre livre de pochette le fait.

Bien sûr, cela signifie que la 52e semaine se termine la 52e semaine qui ne se termine pas le 30 décembre maintenant, mais le 29 décembre. Et chaque année, il ramène un jour à la fois, jusqu'à la 6ème année où nous avons déplacé la fin de la 52e semaine de retour 6 jours (et jeté dans une journée de bond de bonne mesure) de sorte que toute la 1ère semaine de 2017 serait contenu dans l'année 2016, et cela serait idiot. SO 2016 aura 53 semaines. P>

La même logique s'applique aux mois, mais cela peut être plus difficile à repérer. Malheureusement, vous choisissez août 2011 qui a un arrangement soigné de commencer le 1er du mois un lundi. P> xxx pré>

29 d'août est en 5ème semaine d'août, mais avec la même logique , le 1er, le 2 le 3 le 4 septembre serait également la 5ème semaine d'août, et ne peut donc pas être dans la 1ère semaine de septembre. P>

SO 29 SEPT serait, par la simple division du nombre de jours par 7 approche, soit la 5ème semaine de septembre, mais en regardant le calendrier ci-dessus, si 1-4 de septembre est en août, puis le 29 septembre est en 4ème semaine de septembre. P>

Tout dépend de votre défense de votre défense de votre défense Quand une semaine commence. P>

>>> d = datetime.date(2011,9,28)
>>> (d.day-1)//7+1
4
>>> d = datetime.date(2011,9,1)
>>> 
>>> (d.day-1)//7+1
1


1 commentaires

Je pense que votre solution renvoie également 4 pour DateTime.Date (2011,9,28)



2
votes

Cet exemple (un peu maladroit), à l'aide du module de calendrier ...

import calendar
import datetime

def week(dt):
    mth = calendar.monthcalendar(dt.year, dt.month)
    for i, wk in enumerate(mth):
        if dt.day in wk:
            return i + 1

calendar.setfirstweekday(calendar.MONDAY)

week(datetime.datetime(2011, 8, 15)) # 3
week(datetime.datetime(2011, 2, 28)) # 5
week(datetime.datetime(2011, 8, 29)) # 5


0 commentaires

1
votes

à quoi ça se passe. Nous donnons la date à laquelle nous souhaitons trouver la semaine pour. Nous réinitialisons la date au premier jour du mois dans une nouvelle variable. Nous créons ensuite la semaine de l'année pour la première journée et notre date donnée. Soustrayez le premier Isowek de la date de la date donnée et ajoutez-en un. Vous en ajoutez un pour corriger le numéro d'index zéro. Cela devrait donner le numéro de semaine dans le mois. XXX


0 commentaires

0
votes

prendre en compte le commentaire de @usagi: xxx

L'équation suivante gère que le premier jour d'un mois n'est pas nécessaire un lundi: xxx < / Pré>

Le -2 et +2 permettent d'obtenir un numéro de semaine compris entre 1 et 6


0 commentaires

0
votes
d = datetime.datetime.today()
year = d.year
month = d.month
last_day = calendar.monthrange(year,month)[1]
d = datetime.datetime(year, month, last_day)
total_week = (d.day-1)//7+1
print(total_week)

0 commentaires

0
votes

Vérifier la réponse ici: https://stackoverflow.com/a/64192858/6089311

import pandas as pd

def weekinmonth(dates):
    """Get week number in a month.
    
    Parameters: 
        dates (pd.Series): Series of dates.
    Returns: 
        pd.Series: Week number in a month.
    """
    firstday_in_month = dates - pd.to_timedelta(dates.dt.day - 1, unit='d')
    return (dates.dt.day-1 + firstday_in_month.dt.weekday) // 7 + 1
    

df = pd.DataFrame(pd.date_range(' 1/ 1/ 2000', periods = 100, freq ='D'), columns=['Date'])
weekinmonth(df['Date'])


0 commentaires