J'ai le besoin de pouvoir trouver avec précision les mois entre deux dates en python. J'ai une solution qui fonctionne mais qui n'est pas très bonne (comme en élégant) ou rapide.
dateRange = [datetime.strptime(dateRanges[0], "%Y-%m-%d"), datetime.strptime(dateRanges[1], "%Y-%m-%d")]
months = []
tmpTime = dateRange[0]
oneWeek = timedelta(weeks=1)
tmpTime = tmpTime.replace(day=1)
dateRange[0] = tmpTime
dateRange[1] = dateRange[1].replace(day=1)
lastMonth = tmpTime.month
months.append(tmpTime)
while tmpTime < dateRange[1]:
if lastMonth != 12:
while tmpTime.month <= lastMonth:
tmpTime += oneWeek
tmpTime = tmpTime.replace(day=1)
months.append(tmpTime)
lastMonth = tmpTime.month
else:
while tmpTime.month >= lastMonth:
tmpTime += oneWeek
tmpTime = tmpTime.replace(day=1)
months.append(tmpTime)
lastMonth = tmpTime.month
Donc, juste pour expliquer, ce que je fais ici, c'est de prendre les deux dates et de les convertir du format iso en objets datetime python. Ensuite, je boucle en ajoutant une semaine à l'objet datetime de début et je vérifie si la valeur numérique du mois est supérieure (à moins que le mois ne soit décembre, alors il vérifie si la date est inférieure), si la valeur est supérieure, je l'ajoute à la liste des mois et continuez jusqu'à ce que j'arrive à ma date de fin.
Cela fonctionne parfaitement, cela ne semble pas être un bon moyen de le faire ...
python
datetime
monthcalendar
date-math
Joshkunz
la source
la source
Réponses:
Mise à jour 2018-04-20: il semble que OP @Joshkunz demandait de trouver quels mois sont entre deux dates, au lieu de "combien de mois" sont entre deux dates. Donc, je ne sais pas pourquoi @JohnLaRooy est voté plus de 100 fois. @Joshkunz a indiqué dans le commentaire sous la question initiale qu'il voulait les dates réelles [ou les mois], au lieu de trouver le nombre total de mois .
Il est donc apparu que la question était voulue, entre deux dates
2018-04-11
à2018-06-01
Et si c'était entre
2014-04-11
à2018-06-01
? Alors la réponse seraitC'est pourquoi j'ai eu le pseudo code suivant il y a de nombreuses années. Il a simplement suggéré d'utiliser les deux mois comme points finaux et de les parcourir en boucle, en incrémentant d'un mois à la fois. @Joshkunz a mentionné qu'il voulait les «mois» et il a également mentionné qu'il voulait les «dates», sans savoir exactement, il était difficile d'écrire le code exact, mais l'idée est d'utiliser une simple boucle pour parcourir les points finaux, et incrémentation d'un mois à la fois.
La réponse il y a 8 ans en 2010:
Si vous ajoutez une semaine, cela fera environ 4,35 fois le travail nécessaire. Pourquoi pas simplement:
juste du code pseduo pour l'instant, je n'ai pas testé, mais je pense que l'idée dans le même sens fonctionnera.
la source
1
à2
, puis de2
à3
plus tard.Commencez par définir quelques cas de test, puis vous verrez que la fonction est très simple et ne nécessite aucune boucle
Vous devriez ajouter quelques cas de test à votre question, car il y a beaucoup de cas de coin potentiels à couvrir - il existe plusieurs façons de définir le nombre de mois entre deux dates.
la source
Une ligne pour trouver une liste de datetimes, incrémentée par mois, entre deux dates.
la source
[dt for dt in rrule(MONTHLY, bymonthday=10,dtstart=strt_dt, until=end_dt)]
start_date_first = start_date.replace(day=1), end_date_first = end_date.replace(day=1)
alors la règle compte les mois correctement.Cela a fonctionné pour moi -
la source
str()
littéraux de chaîne inutiles .r.months
il commencera à 0Vous pouvez facilement calculer cela en utilisant rrule du module dateutil :
te donnera:
la source
Obtenez le mois de fin (par rapport à l'année et au mois du mois de début, ex: janvier 2011 = 13 si votre date de début commence le octobre 2010), puis générez les dates et heures commençant le mois de début et ce mois de fin comme ceci:
si les deux dates sont de la même année, cela pourrait aussi être simplement écrit comme suit:
la source
Cet article le cloue! Utilisez
dateutil.relativedelta
.la source
str()
casting que j'ai fait est complètement inutile.relativedelta.relativedelta(date2, date1).years * 12
delta.years*12 + delta.months
Ma solution simple:
la source
Définir un « mois » , comme 1 / 12 année, puis procédez comme suit:
Vous pouvez essayer de définir un mois comme «une période de 29, 28, 30 ou 31 jours (selon l'année)». Mais vous faites cela, vous avez un problème supplémentaire à résoudre.
Bien qu'il soit généralement clair que 15 pour Juin e + 1 mois devrait être Juillet 15 e , il n'est généralement pas clair si Janvier 30 e + 1 mois est en Février ou Mars. Dans ce dernier cas, vous pouvez être obligé de calculer la date 30 Février e , puis « corriger » ce 2 Mars e . Mais quand vous faites cela, vous trouverez que le 2 Mars e - 1 mois est clairement 2 Février e . Ergo, reductio ad absurdum (cette opération n'est pas bien définie).
la source
Il existe une solution simple basée sur des années de 360 jours, où tous les mois ont 30 jours. Il convient à la plupart des cas d'utilisation où, étant donné deux dates, vous devez calculer le nombre de mois complets plus les jours restants.
la source
Solution un peu jolie de @ Vin-G.
la source
Vous pouvez également utiliser la bibliothèque de flèches . Voici un exemple simple:
Cela imprimera:
J'espère que cela t'aides!
la source
la source
Essayez quelque chose comme ça. Il comprend actuellement le mois si les deux dates se trouvent dans le même mois.
La sortie ressemble à:
la source
Vous pouvez utiliser python-dateutil . Voir Python: Différence de 2 datetimes en mois
la source
Voici comment procéder avec Pandas FWIW:
Notez qu'il commence avec le mois suivant la date de début donnée.
la source
Cela peut être fait en utilisant datetime.timedelta, où le nombre de jours pour passer au mois suivant peut être obtenu par calender.monthrange. monthrange renvoie le jour de la semaine (0-6 ~ lun-dim) et le nombre de jours (28-31) pour une année et un mois donnés.
Par exemple: monthrange (2017, 1) renvoie (6,31).
Voici le script utilisant cette logique pour itérer entre deux mois.
»
la source
Beaucoup de gens vous ont déjà donné de bonnes réponses pour résoudre ce problème, mais je n'ai lu aucune compréhension de liste en utilisant donc je vous donne ce que j'ai utilisé pour un cas d'utilisation similaire:
la source
la source
tout comme la
range
fonction, quand le mois est 13 , passer à l'année prochaineexemple en shell python
la source
Habituellement, 90 jours ne sont PAS 3 mois littéralement, juste une référence.
Donc, enfin, vous devez vérifier si les jours sont supérieurs à 15 pour ajouter +1 au compteur du mois. ou mieux, ajoutez un autre elif avec un compteur demi-mois.
À partir de cette autre réponse stackoverflow, j'ai finalement terminé avec cela:
Production:
J'ai remarqué que cela ne fonctionne pas si vous ajoutez plus de jours restants dans l'année en cours, et c'est inattendu.
la source
il semble que les réponses ne soient pas satisfaisantes et j'ai depuis utilisé mon propre code qui est plus facile à comprendre
la source
la source
En supposant que upperDate est toujours postérieur à lowerDate et que les deux sont des objets datetime.date:
Je n'ai pas testé cela à fond, mais il semble que cela devrait faire l'affaire.
la source
Voici une méthode:
Il s'agit d'abord de calculer le nombre total de mois entre les deux dates, inclusivement. Ensuite, il crée une liste en utilisant la première date comme base et exécute l'arithmétique des modules pour créer les objets de date.
la source
J'avais en fait besoin de faire quelque chose d'assez similaire maintenant
J'ai fini par écrire une fonction qui renvoie une liste de tuples indiquant le
start
etend
de chaque mois entre deux ensembles de dates afin que je puisse écrire des requêtes SQL à l'arrière de celle-ci pour les totaux mensuels des ventes, etc.Je suis sûr que cela peut être amélioré par quelqu'un qui sait ce qu'il fait mais j'espère que cela aidera ...
La valeur renvoyée se présente comme suit (génération pour aujourd'hui - 365 jours jusqu'à aujourd'hui à titre d'exemple)
Code comme suit (contient des éléments de débogage qui peuvent être supprimés):
la source
En supposant que vous vouliez connaître la «fraction» du mois où se trouvaient les dates, ce que j'ai fait, alors vous devez faire un peu plus de travail.
fournit un exemple qui calcule le nombre de mois entre deux dates inclusivement, y compris la fraction de chaque mois dans laquelle se trouve la date. Cela signifie que vous pouvez calculer combien de mois se situe entre le 20/01/2015 et le 14/02/2015 , où la fraction de la date du mois de janvier est déterminée par le nombre de jours de janvier; ou également en tenant compte du fait que le nombre de jours en février peut changer d'année en année.
Pour ma référence, ce code est également sur github - https://gist.github.com/andrewyager/6b9284a4f1cdb1779b10
la source
Essaye ça:
L'ordre dans lequel vous saisissez les dates ne devrait pas avoir d'importance, et cela prend en compte la différence de longueur des mois.
la source
Cela marche...
la source
la source