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?


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'
>>>

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

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'


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.


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'

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

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']

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.