Eu estou usando o módulo Python datetime. Eu estou olhando para calcular a data de 6 meses a partir da data atual. Alguém poderia me dar uma ajudinha para fazer isso?
O motivo pelo qual desejo gerar uma data 6 meses a partir da data atual é produzir uma data de revisão . Se o usuário inserir dados no sistema, ele terá uma data de revisão de 6 meses a partir da data em que os dados foram inseridos.
6
-o, com suporte para rolar ao longo do ano (e alternar o mês para o mês anterior1
) se passarmos por dezembro. Isso é exatamente o querelativedelta
faz e é de fato o que toda linguagem de programação com suporte para esse tipo de conceito faz.date(2015, 3, 31) + relativedelta(months = 6)
dádatetime.date(2015, 9, 30)
. Perl:DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)
dá2000-10-01T00:00:00
. Php:date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))
dá 2000-10-01. Escolha o seu veneno.Respostas:
Eu achei essa solução boa. (Isso usa a extensão python-dateutil )
A vantagem dessa abordagem é que ela resolve problemas com 28, 30, 31 dias etc. Isso se torna muito útil no tratamento de regras e cenários de negócios (por exemplo, geração de faturas etc.)
fonte
relativedelta
função também recebemonth
como argumento, que basicamente substitui / define / corrige o mês na data passada, o que é muito diferente de adicionar mais meses. Apenas um aviso para as pessoas se perguntarem se a função está quebrada porque elas esqueceram os s extras em meses .datetime
por padrão. Na verdade, presumi que poderia passar "meses" para o timedelta.Bem, isso depende do que você quer dizer com 6 meses a partir da data atual.
Usando meses naturais:
Usando a definição de um banqueiro, 6 * 30:
fonte
(day, month, year) = (day, (month+6)%12, year+(month+6)/12)
pode buggy, pois gera datas inválidas tais como(31, 8, 2015)
->(31, 2, 2016)
Com o Python 3.x, você pode fazer o seguinte:
mas você precisará instalar o módulo python-dateutil :
fonte
pip install ...
from dateutil.relativedelta import relativedelta
. O usoimport *
não é explícito.Para o cálculo do início do mês para o mês:
fonte
O que você quer dizer com "6 meses"?
2009-02-13 + 6 meses == 2009-08-13? Ou são 13-02-2009 + 6 * 30 dias?
Mais informações sobre mx.DateTime
fonte
Então, aqui está um exemplo do
dateutil.relativedelta
que eu achei útil para iterar no ano passado, pulando um mês de cada vez para a data atual:Como nas outras respostas, você precisa descobrir o que você realmente quer dizer com "daqui a seis meses". Se você quer dizer "dia do mês de hoje no mês em seis anos no futuro", isso faria:
fonte
Esta solução funciona corretamente em dezembro, o que a maioria das respostas nesta página não. Você precisa primeiro mudar os meses da base 1 (ou seja, Jan = 1) para a base 0 (ou seja, Jan = 0) antes de usar o módulo (%) ou a divisão inteira (//), caso contrário, novembro (11) mais 1 mês fornece 12 , que ao encontrar o restante (12% 12) fornece 0.
(E não sugira "(mês% 12) + 1" ou outubro + 1 = dezembro!)
No entanto ... Isso não explica problemas como 31 de janeiro + um mês. Então, voltamos ao OP - o que você quer dizer com adicionar um mês? Uma solução é voltar atrás até chegar a um dia válido, já que a maioria das pessoas presumiria o último dia de janeiro, mais um mês, igual ao último dia de fevereiro. Isso também funcionará em números negativos de meses. Prova:
fonte
Eu sei que isso foi por 6 meses, no entanto, a resposta mostra no google para "adicionar meses em python" se você estiver adicionando um mês:
isso contaria os dias do mês atual e os adicionaria à data atual, o uso de 365/12 e 1/12 de um ano pode causar problemas por meses curtos / longos se você estiver repetindo a data.
fonte
Não existe uma maneira direta de fazer isso com a data e hora do Python.
Confira o tipo relativedelta em python-dateutil . Permite especificar um delta de tempo em meses.
fonte
Basta usar o método de cronograma para extrair os meses, adicionar seus meses e criar um novo objeto de data. Se já existe um método para isso, eu não o conheço.
A API é um pouco desajeitada, mas funciona como um exemplo. Obviamente, também não funcionará em casos extremos como 2008-01-31 + 1 mês. :)
fonte
new_month % 12
deve ser(new_month % 12) or 12
. Caso contrário, se você tentar isso em novembro, receberá um erro. :)O pacote Dateutil possui implementação dessa funcionalidade. Mas esteja ciente de que isso será ingênuo , como outros já apontaram.
fonte
Usando bibliotecas padrão do Python, ou seja, sem
dateutil
ou outras, e resolvendo o problema '31 de fevereiro':Teste:
fonte
add_months(datetime.date(2018, 11, 30), 1)
retornosdatetime.date(2019, 12, 30)
(o ano deve ser 2018, não 2019). Portanto, é melhor usar uma biblioteca dedicada e bem testada para isso! Se você realmente precisa usar apenas módulos de biblioteca padrão, veja minha resposta para uma pergunta semelhante .Eu tenho uma maneira melhor de resolver o problema '31 de fevereiro':
Eu acho que também funciona com números negativos (para subtrair meses), mas não testei muito isso.
fonte
A classe QDate do PyQt4 possui uma função addmonths.
fonte
Que tal agora? Não está usando outra biblioteca (
dateutil
) outimedelta
? com base na resposta da vartec , fiz isso e acredito que funciona:Eu tentei usar
timedelta
, mas porque conta os dias365/2
ou6*356/12
nem sempre se traduz em 6 meses, mas sim em 182 dias. por exemploAcredito que geralmente assumimos que 6 meses a partir de um determinado dia chegarão no mesmo dia do mês, mas 6 meses depois (ie
2015-03-10
->2015-09-10
, Não2015-09-08
)Eu espero que você ache isto útil.
fonte
day + datetime.timedelta(6*365/12)
nem sempre funcionará, pois alguns anos têm 365 dias e outros 366.Isso não responde à pergunta específica (usando
datetime
apenas), mas, como outros sugeriram o uso de módulos diferentes, aqui há uma solução usandopandas
.O que funciona como esperado em anos bissextos
fonte
Modificados os AddMonths () para uso no Zope e manipulação de números de dia inválidos:
fonte
fonte
fonte
Resposta de Johannes Wei modificada no caso 1new_month = 121. Isso funciona perfeitamente para mim. Os meses podem ser positivos ou negativos.
fonte
Mais uma solução - espero que alguém goste:
Esta solução não funciona nos dias 29,30,31 para todos os casos, por isso é necessária uma solução mais robusta (que não é mais tão agradável :)):
fonte
A partir desta resposta , consulte ParseDateTime . Exemplo de código a seguir. Mais detalhes: teste de unidade com muitos exemplos de conversão de idioma natural -> AAAA-MM-DD e desafios / bugs aparentes de conversão em tempo analisado .
O código acima gera o seguinte em uma máquina MacOSX:
fonte
Aqui está um exemplo que permite ao usuário decidir como retornar uma data em que o dia é maior que o número de dias no mês.
fonte
dado que sua variável datetime é chamada date:
fonte
Função geral para obter a próxima data após / antes de x meses.
fonte
Uma sugestão rápida é Arrow
seta de instalação do pip
fonte
Use o módulo datetime python para adicionar um intervalo de tempo de seis meses a datetime.today ().
http://docs.python.org/library/datetime.html
Obviamente, você terá que resolver a questão levantada por Johannes Weiß - o que você quer dizer com 6 meses?
fonte
Isto é o que eu vim com. Ele move o número correto de meses e anos, mas ignora os dias (que era o que eu precisava na minha situação).
fonte
Eu uso essa função para alterar ano e mês, mas manter o dia:
Você deve escrever:
fonte
Eu acho que seria mais seguro fazer algo assim em vez de adicionar dias manualmente:
fonte