I have a datetime object produced using
strptime ().
>>> tm
datetime.datetime(2010, 6, 10, 3, 56, 23)
O que eu preciso fazer é arredondar o minuto para o 10º minuto mais próximo. O que tenho feito até este ponto é pegar o valor do minuto e usar round () nele.
min = round(tm.minute, -1)
No entanto, como no exemplo acima, ele fornece um tempo inválido quando o valor do minuto é maior que 56. ou seja: 3:60
Qual é a melhor maneira de fazer isso? Será que datetime
suportar isso?
dt.replace(hour=0, minute=0, second=0)
vez dedt.min
.roundTime(datetime.datetime(2012,12,31,23,44,59,1234),roundTo=60*60*24*7)
vsroundTime(datetime.datetime(2012,12,30,23,44,59,1234),roundTo=60*60*24*7)
datetime.timedelta(100,1,2,3).seconds == 1
Da melhor resposta que modifiquei para uma versão adaptada usando apenas objetos datetime, isso evita ter que fazer a conversão para segundos e torna o código de chamada mais legível:
Amostras com arredondamento de 1 hora e arredondamento de 15 minutos:
fonte
print roundTime(datetime.datetime(2012,12,20,23,44,49),datetime.timedelta(days=15))
2012-12-20 00:00:00
enquantoprint roundTime(datetime.datetime(2012,12,21,23,44,49),datetime.timedelta(days=15))
2012-12-21 00:00:00
Usei o código Stijn Nevens (obrigado Stijn) e tenho um pequeno add-on para compartilhar. Arredondando para cima, para baixo e para o mais próximo.
atualização 09/03/2019 = comentário Spinxz incorporado; obrigado.
atualização 27-12-2019 = comentário Bart incorporado; obrigado.
Testado para date_delta de "X horas" ou "X minutos" ou "X segundos".
fonte
up
qualquer forma, o arredondamento é impreciso com esta função;2019-11-07 14:39:00.776980
comdate_delta
igual a, por exemplo, 30 seg eto='up'
resulta em2019-11-07 14:39:00
.up
arredondamento possa não ser um caso de uso comum, ele é necessário quando você está lidando com aplicativos que começam no limite de minutoPandas tem um recurso de data e hora, mas como a maioria das coisas no Pandas, ele precisa estar no formato de série.
Docs - Altere a sequência de frequência conforme necessário.
fonte
Timestamp
contémfloor
eceil
tambémse não quiser usar a condição, você pode usar o
modulo
operador:ATUALIZAR
você queria algo assim?
.. se você quiser o resultado como string. para obter o resultado datetime, é melhor usar timedelta - veja outras respostas;)
fonte
eu estou usando isso. tem a vantagem de trabalhar com datetimes cientes de tz.
tem a desvantagem de trabalhar por períodos de tempo inferiores a uma hora.
fonte
Aqui está uma solução generalizada mais simples, sem problemas de precisão de ponto flutuante e dependências de biblioteca externa:
No seu caso:
fonte
fonte
Baseado em Stijn Nevens e modificado para Django, use para arredondar a hora atual para os 15 minutos mais próximos.
se precisar de data e hora completas, basta remover o
.strftime('%H:%M:%S')
fonte
Não é o melhor para velocidade quando a exceção é detectada, no entanto, isso funcionaria.
Horários
fonte
Uma solução intuitiva de duas linhas para arredondar para uma determinada unidade de tempo, aqui segundos, para um
datetime
objetot
:Se desejar arredondar para uma unidade diferente, basta alterar
format_str
.Essa abordagem não arredonda para quantias de tempo arbitrárias como os métodos acima, mas é uma maneira agradavelmente pitônica de arredondar para uma determinada hora, minuto ou segundo.
fonte
Outra solução:
Espero que isto ajude!
fonte
O caminho mais curto que eu conheço
fonte
Aqueles parecem excessivamente complexos
fonte
Uma abordagem direta:
fonte
sim, se seus dados pertencerem a uma coluna DateTime em uma série de pandas, você pode arredondá-los usando a função interna pandas.Series.dt.round. Veja a documentação aqui em pandas.Series.dt.round . No seu caso de arredondamento para 10min, será Series.dt.round ('10min') ou Series.dt.round ('600s') assim:
Edite para adicionar o código de exemplo:
fonte