Estou tentando obter a data do mês anterior com python. Aqui está o que eu tentei:
str( time.strftime('%Y') ) + str( int(time.strftime('%m'))-1 )
No entanto, esse caminho é ruim por 2 motivos: primeiro ele retorna 20122 para fevereiro de 2012 (em vez de 201202) e, em segundo lugar, retorna 0 em vez de 12 em janeiro.
Eu resolvi esse problema no bash com
echo $(date -d"3 month ago" "+%G%m%d")
Eu acho que se o bash tem um caminho embutido para esse fim, o python, muito mais equipado, deve fornecer algo melhor do que forçar a escrita do próprio script para atingir esse objetivo. Claro que eu poderia fazer algo como:
if int(time.strftime('%m')) == 1:
return '12'
else:
if int(time.strftime('%m')) < 10:
return '0'+str(time.strftime('%m')-1)
else:
return str(time.strftime('%m') -1)
Não testei esse código e não quero usá-lo de qualquer maneira (a menos que não encontre outra maneira: /)
Obrigado pela ajuda!
Respostas:
As classes datetime e datetime.timedelta são suas amigas.
Como isso:
201202
é impresso.fonte
.replace()
método:datetime.utcnow().replace(day=1) - timedelta(days=1)
.replace()
função. Faça uma vez para obter o último mês e, em seguida, faça novamente para obter o dia que você deseja. Primeiro:d = date.today()
entãoone_month_ago = (d.replace(day=1) - timedelta(days=1)).replace(day=d.day)
calendar
e usandocalendar.mdays[d.month-1]
e mais feiúra em umamin()
função no 2ºreplace
, mas parece não-pitonico e não é responsável por casos extremos. Atualizei minha resposta abaixo usandotry - except
quais contas para todos os casos, embora eu odeie usar exceções como parte de um algoritmo.Você deve usar o dateutil . Com isso, você pode usar o relativedelta, é uma versão aprimorada do timedelta.
fonte
Ou:
fonte
Com base na resposta de bgporter .
fonte
É muito fácil e simples. Faça isso
Aqui está a saída: $ python2.7 main.py
fonte
Para alguém que chegou aqui e deseja obter o primeiro e o último dia do mês anterior:
Resultado:
fonte
Calendar
módulo: stackabuse.com/introduction-to-the-python-calendar-modulefonte
Apenas por diversão, uma resposta matemática pura usando divmod. Bastante ineficiente devido à multiplicação, poderia fazer também uma verificação simples do número de meses (se for igual a 12, aumentar ano, etc.)
fonte
Com a biblioteca muito completa do Pêndulo , temos o
subtract
método (e não "subStract"):Vemos que ele lida com anos de salto.
O equivalente inverso é
add
.https://pendulum.eustace.io/docs/#addition-and-subtraction
fonte
Com base no comentário de @JF Sebastian, você pode encadear a
replace()
função para voltar um "mês". Como um mês não é um período de tempo constante, esta solução tenta voltar à mesma data do mês anterior, o que obviamente não funciona em todos os meses. Nesse caso, esse algoritmo é padronizado para o último dia do mês anterior.Resultado:
fonte
Se você deseja examinar as letras ASCII em um arquivo do tipo EXE em um ambiente LINUX / UNIX, tente "od -c 'filename' | more"
Você provavelmente receberá muitos itens irreconhecíveis, mas todos serão apresentados e as representações HEX serão exibidas, e os caracteres equivalentes a ASCII (se apropriado) seguirão a linha de códigos hexadecimais. Experimente em um pedaço de código compilado que você conhece. Você pode ver coisas nele que reconhece.
fonte
Existe uma biblioteca de alto nível
dateparser
que pode determinar a data anterior dada a linguagem natural e retornar o Python correspondentedatetime
objetofonte