Quero criar uma lista de datas, começando com hoje e retornando um número arbitrário de dias, digamos, no meu exemplo, 100 dias. Existe uma maneira melhor de fazer isso do que isso?
import datetime
a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
dateList.append(a - datetime.timedelta(days = x))
print dateList
range(0, numdays)
neste caso?datetimes = [start + timedelta(seconds=x*60+randint(-30, 30)) for x in range (0, range_end*5, 5)]
onde a variávelrange_end = 10
Pandas
é ótimo para séries temporais em geral e tem suporte direto para períodos.Por exemplo
pd.date_range()
:Ele também tem muitas opções para facilitar a vida. Por exemplo, se você quisesse apenas dias da semana, você apenas trocaria
bdate_range
.Consulte a documentação do período
Além disso, ele suporta totalmente fusos horários de pytz e pode abranger suavemente as mudanças de horário de verão da primavera / outono.
EDITAR por OP:
Se você precisar de datetime reais em python, em oposição aos carimbos de data e hora do Pandas:
Isso usa o parâmetro "end" para corresponder à pergunta original, mas se você quiser datas decrescentes:
fonte
list(map(pd.Timestamp.to_pydatetime, datelist))
recuperar o tipo de data e hora ...pandas.datetime
classe foi descontinuada e será removida dos pandas em uma versão futura. Importe dodatetime
módulo.Obtenha intervalo de datas entre a data inicial e final especificada (otimizado para complexidade de tempo e espaço):
fonte
(end-start+1)
não funciona, você não pode adicionar um timedelta e int. Você poderia usar(end-start).days + 1
embora.Você pode escrever uma função geradora que retorna objetos de data a partir de hoje:
Este gerador retorna datas a partir de hoje e voltando um dia de cada vez. Veja como tirar as 3 primeiras datas:
A vantagem dessa abordagem sobre um loop ou compreensão da lista é que você pode voltar quantas vezes quiser.
Editar
Uma versão mais compacta usando uma expressão de gerador em vez de uma função:
Uso:
fonte
sim, reinvente a roda .... basta pesquisar no fórum e você terá algo como isto:
fonte
dateutil.rrule
implementa o iCalendar RFC - é mais fácil usar funções com um comportamento bem definido em vez de várias implementações com quase a mesma funcionalidade que são um pouco diferentes.dateutil.rrule
permite limitar a correção de erros em um único local.rrule
nome não é arbitrário; é do rfc correspondenteVocê também pode usar o ordinal do dia para simplificar:
Ou, conforme sugerido nos comentários, você pode criar uma lista como esta:
fonte
A partir do título desta pergunta, eu esperava encontrar algo como
range()
, que me permitisse especificar duas datas e criar uma lista com todas as datas intermediárias. Dessa forma, não é necessário calcular o número de dias entre essas duas datas, se não o soubermos de antemão.Portanto, com o risco de ser um pouco fora de tópico, esse recurso faz o trabalho:
Todos os créditos para esta resposta !
fonte
Aqui está uma resposta um pouco diferente, baseada na resposta de S.Lott, que fornece uma lista de datas entre duas datas
start
eend
. No exemplo abaixo, do início de 2017 até hoje.fonte
Uma resposta tardia, eu sei, mas acabei de ter o mesmo problema e decidi que a função de alcance interno do Python estava um pouco ausente nesse aspecto, então substituí-a em um módulo utilitário meu.
fonte
output = []
e trocar as linhas nowhile cmp(...)
loop. Comparerange(0,10,1)
e_range(0,10,1)
.date_range
.Com base nas respostas que escrevi para mim mesmo:
Resultado:
A diferença é que eu recebo o
date
objeto ' ', não o 'datetime.datetime
'.fonte
Se houver duas datas e você precisar do intervalo, tente
fonte
Aqui está a essência que eu criei, a partir do meu próprio código, isso pode ajudar. (Eu sei que a pergunta é muito antiga, mas outros podem usá-la)
https://gist.github.com/2287345
(mesma coisa abaixo)
fonte
Aqui está uma lista de scripts bash para obter uma lista de dias da semana, este é o python 3. Modificado facilmente para qualquer que seja o int, no final, é o número de dias no passado que você deseja.
Aqui está uma variante para fornecer uma data de início (ou melhor, final)
Aqui está uma variante para datas de início e término arbitrárias. não que isso não seja muito eficiente, mas seja bom para inserir um loop for em um script bash:
fonte
Relacionado com Matplotlib
fonte
Sei que isso foi respondido, mas colocarei minha resposta para propósitos históricos e, como acho que é direta.
Claro que não vai ganhar nada como código-golfe, mas acho que é elegante.
fonte
arange
com as etapas é bastante bom, maslistOfDates
consiste em datetime64 numpy em vez de datetime nativo do python.np.arange(…).astype(dt.datetime)
paraarange
retornar o datetime do python nativo em vez do numpy datetime64.Outro exemplo que conta para frente ou para trás, a partir da resposta de Sandeep.
dá
e
dá
Observe que a data de início está incluída no retorno; portanto, se você quiser quatro datas no total, use
timedelta(days=3)
fonte
fonte
Um gerador de período mensal com
datetime
edateutil
. Simples e fácil de se entender:fonte
fonte
end
deveria serbase - datetime.timedelta
. Além disso ... Por que esta solução é melhor que a original?Das respostas acima, criei este exemplo para o gerador de datas
fonte