Analizza la stringa della data e cambia il formato


115

Ho una stringa di data con il formato "Mon Feb 15 2010". Voglio cambiare il formato in '15 / 02/2010 '. Come posso fare questo?


Risposte:


153

datetime il modulo potrebbe aiutarti in questo:

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

Per l'esempio specifico che potresti fare

>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>

2
datetime.datetime (lunedì 15 febbraio 2010, "% a% b% d% Y"). strftime ("% d /% m /% Y") È corretto? ma ho ricevuto un errore.
Nimmy

1
@nimmyliji: è stato corretto 10 minuti prima di pubblicare il tuo commento. e ovviamente dovresti avere date_stringcome stringa.
SilentGhost

3
un esempio completamente funzionante per favore;) quale import / ... è richiesto?
codifica

format1deve essere una stringa per esprimere il formato della stringa della data di input. format2è il formato della stringa di destinazione da generare.
ThorSummoner

1
Puoi approfondire, come dovrebbe apparire format1 in questo esempio?
user1767754

59

Puoi installare la libreria dateutil . La sua parsefunzione può capire in che formato è una stringa senza dover specificare il formato come fai con 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 è un'alternativa migliore se il formato esatto di una stringa ISO legale è sconosciuto. ISO può contenere o meno microsecondi. Può contenere o meno una "Z" finale. datetime.strptime non è abbastanza flessibile da adattarsi a questo.
Michael Kariv

4
Pase Date deve essere usato con cura. parse ('12 .07.2017 ') restituisce datetime (2017, 12, 7, ..) ma parse ('13 .07.2017') restituisce .datetime (2017, 7, 13, ...)
ego2dot0

In python 3.xnecessità di installarepython-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

Poiché questa domanda viene spesso, ecco la semplice spiegazione.

datetimeor timemodule ha due importanti funzioni.

  • strftime : crea una rappresentazione di stringa della data o dell'ora da un oggetto datetime o time.
  • strptime : crea un oggetto datetime o time da una stringa.

In entrambi i casi, abbiamo bisogno di una stringa di formattazione. È la rappresentazione che indica come è formattata la data o l'ora nella stringa.

Supponiamo ora di avere un oggetto data.

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

Se vogliamo creare una stringa da questa data nel formato 'Mon Feb 15 2010'

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

Supponiamo di voler convertire di snuovo questo in un datetimeoggetto.

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

Fare riferimento a questo documento tutte le direttive di formattazione relative a datetime.


Amo la tua spiegazione.
Enchance

2

Solo per motivi di completamento: quando si analizza una data utilizzando strptime()e la data contiene il nome di un giorno, mese, ecc., Essere consapevoli del fatto che è necessario tenere conto delle impostazioni locali.

È menzionato anche come nota a piè di pagina nei documenti .

Come esempio:

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: le due righe seguenti funzioneranno. Non ho visto nessuno pubblicato la soluzione completa per il problema di esempio che è stato chiesto. Si spera che questa sia una spiegazione sufficiente.

import datetime

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

Produzione:

15/02/2010

1

Puoi ottenere questo risultato anche usando i panda:

import pandas as pd

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

Produzione:

'15/02/2010'

Puoi applicare l'approccio panda per diversi tipi di dati come:

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)

Produzione:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.