Como descobrir qual número da semana é o ano atual em 16 de junho (wk24) com o Python?
python
datetime
week-number
Gerry
fonte
fonte
strftime("%U", d)
pode ser diferente daisocalendar()
. Por exemplo, se você mudar o ano para 2004, obterá a semana 24strftime()
e a semana 25isocalendar()
.Respostas:
datetime.date
tem umisocalendar()
método, que retorna uma tupla contendo a semana do calendário:datetime.date.isocalendar () é um método de instância que retorna uma tupla contendo ano, número da semana e dia da semana na respectiva ordem para a instância de data especificada.
fonte
[1]
' ou fornecesse um ponteiro para onde procurar as informações.date(2010, 1, 1).isocalendar()[1]
retorna53
. Dos documentos: "Por exemplo, 2004 começa na quinta-feira, portanto, a primeira semana do ano ISO 2004 começa na segunda-feira, 29 de dezembro de 2003 e termina no domingo, 4 de janeiro de 2004, de modo quedate(2003, 12, 29).isocalendar() == (2004, 1, 1)
edate(2004, 1, 4).isocalendar() == (2004, 1, 7)
".isocalendar()
é ótimo, mas tenha certeza que é o que você quer. Hoje é um exemplo perfeito. 01/01/2016 é igual a(2015, 53, 5)
.now.strftime("%W")
enow.strftime("%U")
são iguais aos00
que muitas vezes é o que se deseja. Exemplos STRFTIMEVocê pode obter o número da semana diretamente de datetime como string.
Também é possível obter diferentes "tipos" do número da semana do ano alterando o
strftime
parâmetro para:Eu descobri sobre isso a partir daqui . Funcionou para mim no Python 2.7.6
fonte
Invalid format string
para esse padrão. Os documentos deles também não são mencionados%V
.%G-%V
vez de%Y-%V
.%G
é o equivalente do ano ISO de%Y
Eu acredito que
date.isocalendar()
vai ser a resposta. Este artigo explica a matemática por trás do calendário ISO 8601. Confira a parte date.isocalendar () da página de data e hora da documentação do Python..isocalendar () retorna uma tupla de três com (ano, número da semana, dia da semana).
dt.isocalendar()[0]
retorna o ano,dt.isocalendar()[1]
retorna o número da semana,dt.isocalendar()[2]
retorna o dia da semana. Simples como pode ser.fonte
Aqui está outra opção:
que imprime
24
.Consulte: http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior
fonte
A semana ISO sugerida por outras pessoas é boa, mas pode não atender às suas necessidades. Assume que cada semana começa com uma segunda-feira, o que leva a algumas anomalias interessantes no início e no final do ano.
Se você preferir usar uma definição que diga que a semana 1 é sempre de 1 a 7 de janeiro, independentemente do dia da semana, use uma derivação como esta:
fonte
Geralmente, para obter o número da semana atual (começa no domingo):
fonte
Para o valor inteiro da semana instantânea do ano, tente:
fonte
Existem muitos sistemas para numeração semanal . A seguir, são apresentados os sistemas mais comuns, simplesmente com exemplos de código:
ISO : a primeira semana começa na segunda-feira e deve conter o dia 4 de janeiro. O calendário ISO já está implementado no Python:
América do Norte : a primeira semana começa no domingo e deve conter o 1º de janeiro. O código a seguir é minha versão modificada da implementação do calendário ISO do Python para o sistema norte-americano:
fonte
Se você estiver usando apenas o número da semana isocalendar em todo o quadro, o seguinte deverá ser suficiente:
Isso recupera o segundo membro da tupla retornado por isocalendar para o número da semana.
No entanto, se você estiver usando funções de data que tratam do calendário gregoriano, apenas o isocalendar não funcionará! Veja o seguinte exemplo:
A string aqui diz para retornar a segunda-feira da primeira semana de 2014 como nossa data. Quando usamos o isocalendar para recuperar o número da semana aqui, esperamos obter o mesmo número da semana, mas não o fazemos. Em vez disso, temos um número de semanas de 2. Por quê?
A primeira semana do calendário gregoriano é a primeira semana que contém uma segunda-feira. A primeira semana do isocalendar é a primeira semana que contém uma quinta-feira. A semana parcial no início de 2014 contém uma quinta-feira, portanto, é a primeira semana do isocalendar, e
date
semana 2.Se queremos obter a semana gregoriana, precisaremos converter do isocalendar para o gregoriano. Aqui está uma função simples que faz o truque.
fonte
Você pode tentar a diretiva% W como abaixo:
'% W': número da semana do ano (segunda-feira como o primeiro dia da semana) como um número decimal. Todos os dias em um novo ano anterior à primeira segunda-feira são considerados na semana 0. (00, 01, ..., 53)
fonte
isocalendar () retorna valores incorretos de ano e número da semana para algumas datas:
Compare com a abordagem de Mark Ransom:
fonte
Resumo a discussão em duas etapas:
datetime
objeto.datetime
objeto ou umdate
objeto para calcular o número da semana.Aquecer
`` python
`` ``
1º passo
Para gerar um
datetime
objeto manualmente , podemos usardatetime.datetime(2017,5,3)
oudatetime.datetime.now()
.Mas, na realidade, geralmente precisamos analisar uma string existente. podemos usar a
strptime
função, comodatetime.strptime('2017-5-3','%Y-%m-%d')
na qual você precisa especificar o formato. Detalhes de diferentes códigos de formato podem ser encontrados na documentação oficial .Como alternativa, uma maneira mais conveniente é usar o módulo dateparse . Exemplos são
dateparser.parse('16 Jun 2010')
,dateparser.parse('12/2/12')
oudateparser.parse('2017-5-3')
As duas abordagens acima retornarão um
datetime
objeto.2º passo
Use o
datetime
objeto obtido para chamarstrptime(format)
. Por exemplo,`` python
`` ``
É muito complicado decidir qual formato usar. Uma maneira melhor é obter um
date
objeto para chamarisocalendar()
. Por exemplo,`` python
`` ``
Na realidade, você provavelmente usará
date.isocalendar()
para preparar um relatório semanal, especialmente na temporada de compras "Natal e Ano Novo".fonte
fonte
Muitas respostas foram dadas, mas eu gostaria de adicionar a elas.
Se você precisar que a semana seja exibida como um estilo de ano / semana (por exemplo, 1953 - semana 53 de 2019, 2001 - semana 1 de 2020 etc.), faça o seguinte:
Vai levar o ano e a semana atuais, e long_week_num no dia da escrita será:
fonte
date()
zero?datetime.datetime()
instâncias têm um.date()
método para esse trabalho.