Analisar string de data e alterar o formato

115

Tenho uma string de data com o formato 'Seg, 15 de fevereiro de 2010'. Desejo alterar o formato para '15/02/2010 '. Como posso fazer isso?

Nimmy
fonte
Duplicado de todos estes: stackoverflow.com/search?q=%5Bpython%5D+parse+date . Duplicata exata deste: stackoverflow.com/questions/1713594/…
S.Lott

Respostas:

153

datetime módulo pode ajudá-lo com isso:

datetime.datetime.strptime(date_string, format1).strftime(format2)

Para o exemplo específico, você poderia fazer

>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>
SilentGhost
fonte
2
datetime.datetime (Seg, 15 de fevereiro de 2010, "% a% b% d% Y"). strftime ("% d /% m /% Y") Está correto? mas eu tenho um erro.
Nimmy de
1
@nimmyliji: foi corrigido 10 minutos antes de você postar seu comentário. e, claro, você deve ter date_stringcomo uma string.
SilentGhost de
3
um exemplo totalmente funcional, por favor;) qual importação / ... é necessária?
codificação de
format1precisa ser uma string para expressar o formato da string de data de entrada. format2é o formato de string de destino para saída.
ThorSummoner de
1
Você pode explicar melhor, como deve ser o formato1 neste exemplo?
user1767754
59

Você pode instalar a biblioteca dateutil . Sua parsefunção pode descobrir em que formato uma string está, sem precisar especificar o formato como você faz com datetime.strptime.

from dateutil.parser import parse
dt = parse('Mon Feb 15 2010')
print(dt)
# datetime.datetime(2010, 2, 15, 0, 0)
print(dt.strftime('%d/%m/%Y'))
# 15/02/2010
Llazzaro
fonte
dateutil.parse é uma alternativa melhor se o formato exato de uma string ISO legal for desconhecido. ISO pode ou não conter microssegundos. Pode ou não conter "Z" à direita. datetime.strptime não é flexível o suficiente para acomodar isso.
Michael Kariv
4
Pase Date deve ser usado com cuidado. parse ('12 .07.2017 ') retorna datetime (2017, 12, 7, ..) mas parse ('13 .07.2017') retorna .datetime (2017, 7, 13, ...)
ego2dot0
Em python 3.xnecessidades para instalarpython-dateutil pip install python-dateutil
AB Abhi
24
>>> from_date="Mon Feb 15 2010"
>>> import time                
>>> conv=time.strptime(from_date,"%a %b %d %Y")
>>> time.strftime("%d/%m/%Y",conv)
'15/02/2010'
ghostdog74
fonte
23

converter string em objeto datetime

from datetime import datetime
s = "2016-03-26T09:25:55.000Z"
f = "%Y-%m-%dT%H:%M:%S.%fZ"
out = datetime.strptime(s, f)
print(out)
output:
2016-03-26 09:25:55
anjaneyulubatta505
fonte
Isso não está de acordo com o formato que ele pediu, que continha uma string de mês "fevereiro".
Shahir Ansari
@ShahirAnsari você pode alterar o formato conforme desejar, consulte " docs.python.org/3/library/datetime.html "
anjaneyulubatta505
14

Como essa pergunta surge com frequência, aqui está uma explicação simples.

datetimeou timemódulo tem duas funções importantes.

  • strftime - cria uma representação de string de data ou hora de um objeto datetime ou time.
  • strptime - cria um objeto datetime ou time a partir de uma string.

Em ambos os casos, precisamos de uma string de formatação. É a representação que informa como a data ou hora é formatada em sua string.

Agora vamos supor que temos um objeto de data.

>>> from datetime import datetime
>>> d = datetime(2010, 2, 15)
>>> d
datetime.datetime(2010, 2, 15, 0, 0)

Se quisermos criar uma string a partir desta data no formato 'Mon Feb 15 2010'

>>> s = d.strftime('%a %b %d %y')
>>> print s
Mon Feb 15 10

Vamos supor que queremos convertê-lo snovamente em um datetimeobjeto.

>>> new_date = datetime.strptime(s, '%a %b %d %y')
>>> print new_date
2010-02-15 00:00:00

Consulte este documento todas as diretivas de formatação relacionadas a data e hora.

thavan
fonte
Eu amo sua explicação.
enchance
2

Apenas para fins de conclusão: ao analisar uma data usando strptime()e a data contém o nome de um dia, mês, etc., esteja ciente de que você deve levar em conta a localidade.

Também é mencionado como uma nota de rodapé na documentação .

Como um exemplo:

import locale
print(locale.getlocale())

>> ('nl_BE', 'ISO8859-1')

from datetime import datetime
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> ValueError: time data '6-Mar-2016' does not match format '%d-%b-%Y'

locale.setlocale(locale.LC_ALL, 'en_US')
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> '2016-03-06'
ƘɌỈSƬƠƑ
fonte
2

@codeling e @ user1767754: As duas linhas a seguir funcionarão. Não vi ninguém postar a solução completa para o problema de exemplo que foi perguntado. Esperançosamente, esta é uma explicação suficiente.

import datetime

x = datetime.datetime.strptime("Mon Feb 15 2010", "%a %b %d %Y").strftime("%d/%m/%Y")
print(x)

Resultado:

15/02/2010
Gobryas
fonte
1

Você também pode conseguir isso usando pandas:

import pandas as pd

pd.to_datetime('Mon Feb 15 2010', format='%a %b %d %Y').strftime('%d/%m/%Y')

Resultado:

'15/02/2010'

Você pode aplicar a abordagem pandas para diferentes tipos de dados como:

import pandas as pd
import numpy as np

def reformat_date(date_string, old_format, new_format):
    return pd.to_datetime(date_string, format=old_format, errors='ignore').strftime(new_format)

date_string = 'Mon Feb 15 2010'
date_list = ['Mon Feb 15 2010', 'Wed Feb 17 2010']
date_array = np.array(date_list)
date_series = pd.Series(date_list)

old_format = '%a %b %d %Y'
new_format = '%d/%m/%Y'

print(reformat_date(date_string, old_format, new_format))
print(reformat_date(date_list, old_format, new_format).values)
print(reformat_date(date_array, old_format, new_format).values)
print(date_series.apply(lambda x: reformat_date(x, old_format, new_format)).values)

Resultado:

15/02/2010
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
nimbous
fonte