Existe uma maneira de usar a biblioteca padrão do Python para determinar facilmente (ou seja, uma chamada de função) o último dia de um determinado mês?
Se a biblioteca padrão não suportar isso, o pacote dateutil suporta isso?
Eu não percebi isso antes quando estava examinando a documentação do calendar
módulo , mas um método chamado monthrange
fornece essas informações:
monthrange (ano, mês)
Retorna o dia da semana do primeiro dia do mês e o número de dias no mês, para o ano e mês especificados.
>>> import calendar
>>> calendar.monthrange(2002,1)
(1, 31)
>>> calendar.monthrange(2008,2)
(4, 29)
>>> calendar.monthrange(2100,2)
(0, 28)
tão:
calendar.monthrange(year, month)[1]
parece ser o caminho mais simples a seguir.
Só para esclarecer, também monthrange
suporta anos bissextos:
>>> from calendar import monthrange
>>> monthrange(2012, 2)
(2, 29)
Minha resposta anterior ainda funciona, mas é claramente abaixo do ideal.
28
como a resposta, o que é correto, usando as regras para o calendário gregorianomonthrange
é um nome confuso. Você pensaria que retornaria(first_day, last_day)
, não(week_day_of_first_day, number_of_days)
Se você não deseja importar o
calendar
módulo, uma função simples de duas etapas também pode ser:Saídas:
fonte
EDIT: Veja a resposta de @Blair Conrad para uma solução mais limpa
fonte
today.month + 1 == 13
e você recebe umValueError
.(today.month % 12) + 1
since since12 % 12
0Isso é realmente muito fácil com
dateutil.relativedelta
(pacote python-datetutil for pip).day=31
sempre retornará sempre o último dia do mês.Exemplo:
fonte
datetime(2014, 2, 1) + relativedelta(days=31)
dádatetime(2014, 3, 4, 0, 0)
...months
seja adicionado e depoisseconds
subtraído. Uma vez que eles são aprovados,**kwargs
eu não confiaria nisso e faria uma série de operações separadas: onow + relative(months=+1) + relative(day=1) + relative(days=-1)
que é inequívoco.last_day = (<datetime_object> + relativedelta(day=31)).day
EDIT: veja minha outra resposta . Ele tem uma implementação melhor do que esta, que deixo aqui para o caso de alguém estar interessado em ver como alguém pode "rolar sua própria" calculadora.
@ John Millikin dá uma boa resposta, com a complicação adicional de calcular o primeiro dia do próximo mês.
O seguinte não é particularmente elegante, mas para descobrir o último dia do mês em que uma determinada data reside, você pode tentar:
fonte
today = datetime.date.today(); start_date = today.replace(day=1)
. Você gostaria de evitar ligar para datetime.now duas vezes, caso o tenha telefonado antes da meia-noite de 31 de dezembro e depois da meia-noite. Você receberá 01-01-2016 em vez de 01/12/2016 ou 01-01-2017.date
for uma instância dedatetime.date
,datetime.datetime
e tambémpandas.Timestamp
.Se
dateutil.relativedelta
você usar a última data do mês, será assim:A idéia é obter o primeiro dia do mês e usar
relativedelta
1 mês à frente e 1 dia de volta para obter o último dia do mês que você deseja.fonte
Outra solução seria fazer algo assim:
E use a função assim:
fonte
fonte
fonte
se você estiver disposto a usar uma biblioteca externa, consulte http://crsmithdev.com/arrow/
Você pode obter o último dia do mês com:
Isso retorna um objeto de data que você pode fazer sua manipulação.
fonte
Para obter a última data do mês, fazemos algo assim:
Agora, para explicar o que estamos fazendo aqui, vamos dividi-lo em duas partes:
primeiro é obter o número de dias do mês atual para o qual usamos o intervalo do mês que Blair Conrad já mencionou sua solução:
segundo é obter a última data em si, o que fazemos com a ajuda de substituir, por exemplo
e quando os combinamos conforme mencionado na parte superior, obtemos uma solução dinâmica.
fonte
date.replace(day=day)
para que todos saibam o que está acontecendo.No Python 3.7, há a
calendar.monthlen(year, month)
função não documentada :É equivalente à chamada documentada
calendar.monthrange(year, month)[1]
.fonte
fonte
Use pandas!
fonte
pd.series.dt.is_month_end
ligaçãonow=datetime.datetime.now(); pd_now = pd.to_datetime(now); print(pd_now.days_in_month)
Para mim, é a maneira mais simples:
fonte
A maneira mais fácil (sem precisar importar o calendário) é obter o primeiro dia do próximo mês e subtrair um dia dele.
Resultado:
PS: esse código roda mais rápido em comparação com a
import calendar
abordagem; ver abaixo:RESULTADO:
Este código pressupõe que você deseja a data do último dia do mês (ou seja, não apenas a parte DD, mas a data AAAAMMDD inteira)
fonte
import calendar
?Aqui está outra resposta. Não são necessários pacotes extras.
Obtenha o primeiro dia do próximo mês e subtraia um dia dele.
fonte
Você pode calcular a data final você mesmo. a lógica simples é subtrair um dia a partir da data de início do próximo mês. :)
Então escreva um método personalizado,
Chamando,
Ele retornará a data final deste mês. Passe qualquer data para esta função. retorna a data final desse mês.
fonte
você pode usar o relativedelta https://dateutil.readthedocs.io/en/stable/relativedelta.html
month_end = <your datetime value within the month> + relativedelta(day=31)
que fornecerá o último dia.fonte
Esta é a solução mais simples para mim, usando apenas a biblioteca de data e hora padrão:
fonte
Isso não aborda a questão principal, mas um bom truque para obter o último dia da semana em um mês é usar
calendar.monthcalendar
, que retorna uma matriz de datas, organizada com segunda-feira como primeira coluna e domingo como último.A
[0:-2]
coisa toda é raspar as colunas do fim de semana e jogá-las fora. As datas que ficam fora do mês são indicadas por 0, então o máximo as ignora efetivamente.O uso de
numpy.ravel
não é estritamente necessário, mas eu odeio confiar na mera convenção quenumpy.ndarray.max
achatará a matriz se não for informado sobre qual eixo calcular sobre.fonte
Resultado:
Isso imprimirá o último dia do mês atual. Neste exemplo, era 15 de maio de 2016. Portanto, sua produção pode ser diferente; no entanto, a produção será o número de dias que o mês atual for. Ótimo se você deseja verificar o último dia do mês executando um trabalho cron diário.
Assim:
Resultado:
A menos que seja o último dia do mês.
fonte
Eu prefiro assim
fonte
Se você deseja criar sua própria função pequena, este é um bom ponto de partida:
Para isso, você precisa conhecer as regras para os anos bissextos:
fonte
Se você passar em um período, poderá usar o seguinte:
fonte
No código abaixo, 'get_last_day_of_month (dt)' fornecerá isso, com a data no formato de string como 'YYYY-MM-DD'.
fonte
A maneira mais simples é usar
datetime
e alguma matemática de datas, por exemplo, subtrair um dia do primeiro dia do próximo mês:Como alternativa, você pode usar
calendar.monthrange()
para obter o número de dias em um mês (considerando os anos bissextos) e atualizar a data de acordo:Uma referência rápida mostra que a primeira versão é notavelmente mais rápida:
fonte
Aqui está uma versão longa (fácil de entender), mas cuida dos anos bissextos.
Saúde, JK
fonte
else: pass
e também pode se livrar deif year % 400 == 0: leap_year_flag = 1
pequenas modificaçõesAqui está uma solução baseada em python lambdas:
O
next_month
lambda encontra a representação da tupla do primeiro dia do próximo mês e passa para o próximo ano. Omonth_end
lambda transforma uma data (dte
) em uma tupla, aplicanext_month
e cria uma nova data. Então o "final do mês" é apenas o primeiro dia do mês seguintetimedelta(days=1)
.fonte