J'utilise le module Python datetime. Je cherche à calculer la date à 6 mois de la date actuelle. Quelqu'un pourrait-il m'aider un peu à faire cela?
La raison pour laquelle je souhaite générer une date à 6 mois de la date actuelle est de produire une date de révision . Si l'utilisateur entre des données dans le système, il aura une date de révision de 6 mois à compter de la date à laquelle il a entré les données.
6
y, avec un support pour reculer sur l'année (et faire reculer le mois1
) si nous dépassons décembre. Il se trouve que c'est exactement ce quirelativedelta
fait et c'est en fait ce que fait chaque langage de programmation prenant en charge ce type de concept.date(2015, 3, 31) + relativedelta(months = 6)
donnedatetime.date(2015, 9, 30)
. Perl:DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)
donne2000-10-01T00:00:00
. Php:date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))
donne 2000-10-01. Choisis ton poison.Réponses:
J'ai trouvé cette solution bonne. (Ceci utilise l' extension python-dateutil )
L'avantage de cette approche est qu'elle prend en charge les problèmes avec 28, 30, 31 jours, etc. Cela devient très utile pour gérer les règles et les scénarios commerciaux (par exemple, la génération de factures, etc.)
la source
relativedelta
fonction prend égalementmonth
comme argument, qui remplace essentiellement / définit / fixe le mois dans la date passée, ce qui est très différent de l'ajout de mois supplémentaires. Juste un avertissement pour les gens qui se demandent si la fonction est cassée car ils ont oublié les s supplémentaires en mois .datetime
par défaut. J'ai en fait supposé que je pourrais passer des "mois" à timedelta.Eh bien, cela dépend de ce que vous entendez par 6 mois à compter de la date actuelle.
Utilisation des mois naturels:
En utilisant la définition d'un banquier, 6 * 30:
la source
(day, month, year) = (day, (month+6)%12, year+(month+6)/12)
peut boguer, car elle génère des dates invalides telles que(31, 8, 2015)
->(31, 2, 2016)
Avec Python 3.x, vous pouvez le faire comme ceci:
mais vous devrez installer le module python-dateutil :
la source
pip install ...
from dateutil.relativedelta import relativedelta
. L'utilisationimport *
n'est pas explicite.Pour le calcul du début de mois en mois:
la source
Qu'entendez-vous par «6 mois»?
Est-ce que 2009-02-13 + 6 mois == 2009-08-13? Ou est-ce le 2009-02-13 + 6 * 30 jours?
Plus d'informations sur mx.DateTime
la source
Donc, voici un exemple de ce
dateutil.relativedelta
que j'ai trouvé utile pour répéter l'année dernière, en sautant un mois à chaque fois jusqu'à la date actuelle:Comme pour les autres réponses, vous devez comprendre ce que vous entendez réellement par «6 mois à partir de maintenant». Si vous voulez dire «le jour du mois d'aujourd'hui dans le mois, six ans dans le futur», cela ferait:
la source
Cette solution fonctionne correctement pour décembre, ce que la plupart des réponses sur cette page ne font pas. Vous devez d'abord déplacer les mois de la base 1 (ie Jan = 1) à la base 0 (ie Jan = 0) avant d'utiliser le module (%) ou la division entière (//), sinon novembre (11) plus 1 mois vous donne 12 , qui lors de la recherche du reste (12% 12) donne 0.
(Et ne suggérez pas "(mois% 12) + 1" ou oct + 1 = décembre!)
Cependant ... Cela ne représente pas un problème comme le 31 janvier + un mois. Nous revenons donc à l'OP - que voulez-vous dire par l'ajout d'un mois? Une solution consiste à revenir en arrière jusqu'à ce que vous arriviez à un jour valide, étant donné que la plupart des gens supposent que le dernier jour de janvier, plus un mois, est égal au dernier jour de février. Cela fonctionnera également sur un nombre de mois négatif. Preuve:
la source
Je sais que c'était pour 6 mois, mais la réponse indique dans google pour "ajouter des mois en python" si vous ajoutez un mois:
cela compterait les jours du mois en cours et les ajouterait à la date du jour, l'utilisation de 365/12 signifierait qu'un 1/12 d'année peut causer des problèmes pour les mois courts / longs si votre itération sur la date.
la source
Il n'y a aucun moyen direct de le faire avec le datetime de Python.
Découvrez le type relativedelta sur python-dateutil . Il vous permet de spécifier un delta temporel en mois.
la source
Utilisez simplement la méthode du calendrier pour extraire les mois, ajoutez vos mois et créez un nouvel objet date. S'il existe déjà une méthode pour cela, je ne la connais pas.
L'API est un peu maladroite, mais fonctionne comme exemple. Ne fonctionnera évidemment pas non plus sur les cas d'angle comme le 2008-01-31 + 1 mois. :)
la source
new_month % 12
devrait l'être(new_month % 12) or 12
. Sinon, si vous essayez ceci en novembre, vous obtiendrez une erreur. :)Le package Dateutil a implémenté une telle fonctionnalité. Mais sachez que ce sera naïf , comme d'autres l'ont déjà souligné.
la source
Utilisation de bibliothèques standard Python, c'est-à-dire sans
dateutil
ou autres, et résolution du problème du «31 février»:Essai:
la source
add_months(datetime.date(2018, 11, 30), 1)
retoursdatetime.date(2019, 12, 30)
(l'année devrait être 2018, pas 2019). Donc, mieux vaut utiliser une bibliothèque dédiée et bien testée pour cela! Si vous avez vraiment besoin d'utiliser uniquement des modules de bibliothèque standard, consultez ma réponse à une question similaire .J'ai une meilleure façon de résoudre le problème du «31 février»:
Je pense que cela fonctionne également avec des nombres négatifs (pour soustraire des mois), mais je n'ai pas beaucoup testé cela.
la source
La classe QDate de PyQt4 a une fonction addmonths.
la source
Que dis-tu de ça? Vous n'utilisez pas une autre bibliothèque (
dateutil
) outimedelta
? en s'appuyant sur la réponse de vartec , je l'ai fait et je pense que cela fonctionne:J'ai essayé d'utiliser
timedelta
, mais parce que ça compte les jours,365/2
ou6*356/12
ne se traduit pas toujours par 6 mois, mais plutôt 182 jours. par exempleJe crois que nous supposons généralement que 6 mois à partir d'un certain jour atterriront le même jour du mois mais 6 mois plus tard (c'est
2015-03-10
-à- dire ->2015-09-10
, Non2015-09-08
)J'espère que ça t'as aidé.
la source
day + datetime.timedelta(6*365/12)
ne fonctionnera pas toujours, car certaines années ont 365 jours et d'autres 366 jours.Cela ne répond pas à la question spécifique (en utilisant
datetime
uniquement) mais, étant donné que d'autres ont suggéré l'utilisation de différents modules, il existe ici une solution utilisantpandas
.Qui fonctionne comme prévu dans les années bissextiles
la source
Modification de AddMonths () pour une utilisation dans Zope et la gestion des numéros de jour non valides:
la source
la source
la source
Modification de la réponse de Johannes Wei dans le cas 1new_month = 121. Cela fonctionne parfaitement pour moi. Les mois peuvent être positifs ou négatifs.
la source
Encore une autre solution - j'espère que quelqu'un l'aimera:
Cette solution ne fonctionne pas pendant les jours 29,30,31 pour tous les cas, donc une solution plus robuste est nécessaire (ce qui n'est plus si agréable :)):
la source
À partir de cette réponse , voir parsedatetime . Un exemple de code suit. Plus de détails: test unitaire avec de nombreux exemples de conversion en langage naturel -> AAAA-MM-JJ , et défis / bogues de conversion apparents en temps réel .
Le code ci-dessus génère les éléments suivants à partir d'une machine MacOSX:
la source
Voici un exemple qui permet à l'utilisateur de décider comment renvoyer une date où le jour est supérieur au nombre de jours du mois.
la source
étant donné que votre variable datetime est appelée date:
la source
Fonction générale pour obtenir la prochaine date après / avant x mois.
la source
Une suggestion rapide est Arrow
pip d'installation flèche
la source
Utilisez le module datetime python pour ajouter un délai de six mois à datetime.today ().
http://docs.python.org/library/datetime.html
Vous devrez bien sûr résoudre le problème soulevé par Johannes Weiß - que voulez - vous dire par 6 mois?
la source
C'est ce que j'ai trouvé. Il déplace le nombre correct de mois et d'années mais ignore les jours (ce dont j'avais besoin dans ma situation).
la source
J'utilise cette fonction pour changer l'année et le mois mais garder le jour:
Vous devez écrire:
la source
Je pense qu'il serait plus sûr de faire quelque chose comme ça au lieu d'ajouter manuellement des jours:
la source