Przeanalizuj ciąg daty i zmień format


115

Mam ciąg daty w formacie „Mon Feb 15 2010”. Chcę zmienić format na „15/02/2010”. W jaki sposób mogę to zrobić?


Odpowiedzi:


153

datetime moduł może ci w tym pomóc:

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

Na konkretny przykład, który możesz zrobić

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

2
datetime.datetime (poniedziałek, 15 lutego 2010 r., „% a% b% d% Y”). strftime („% d /% m /% Y”) Czy to prawda? ale mam błąd.
Nimmy

1
@nimmyliji: problem został rozwiązany 10 minut przed opublikowaniem komentarza. i oczywiście powinieneś mieć date_stringjako ciąg.
SilentGhost

3
w pełni działający przykład;) jaki import / ... jest wymagany?
kodowanie

format1musi być ciągiem, aby wyrazić format ciągu wejściowego daty. format2to docelowy format ciągu do wyprowadzenia.
ThorSummoner

1
Czy możesz wyjaśnić więcej, jak powinien wyglądać format1 w tym przykładzie?
user1767754

59

Możesz zainstalować bibliotekę dateutil . Jego parsefunkcja może dowiedzieć się, w jakim formacie znajduje się ciąg, bez konieczności określania formatu, tak jak robisz 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 jest lepszą alternatywą, jeśli dokładny format legalnego ciągu ISO nie jest znany. ISO może zawierać mikrosekundy lub nie. Może, ale nie musi, zawierać końcowe „Z”. datetime.strptime nie jest wystarczająco elastyczny, aby się do tego dostosować.
Michael Kariv,

4
Pase Date należy używać ostrożnie. parse ('12 .07.2017 ') zwraca datetime (2017, 12, 7, ..), ale parse ('13 .07.2017') zwraca .datetime (2017, 7, 13, ...)
ego2dot0

Na python 3.xpotrzeby instalowaniapython-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

Ponieważ to pytanie często się pojawia, oto proste wyjaśnienie.

datetimelub timemoduł ma dwie ważne funkcje.

  • strftime - tworzy ciąg reprezentujący datę lub godzinę z obiektu daty i godziny.
  • strptime - tworzy obiekt z datą i godziną lub czasem z łańcucha.

W obu przypadkach potrzebujemy ciągu formatującego. Jest to reprezentacja, która mówi, w jaki sposób data lub czas są sformatowane w twoim ciągu.

Teraz załóżmy, że mamy obiekt daty.

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

Jeśli chcemy utworzyć ciąg z tej daty w formacie 'Mon Feb 15 2010'

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

Załóżmy, że chcemy sponownie przekonwertować to na datetimeobiekt.

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

Zapoznaj się z tym dokumentem ze wszystkimi dyrektywami dotyczącymi formatowania dotyczącymi daty i godziny.


Uwielbiam twoje wyjaśnienie.
enchance

2

Tylko ze względu na zakończenie: podczas analizowania daty przy użyciu, strptime()a data zawiera nazwę dnia, miesiąca itp., Pamiętaj, że musisz uwzględnić ustawienia regionalne.

Wspomina się o tym również jako przypis w dokumentacji .

Jako przykład:

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 i @ user1767754: Te dwie linie będą działać. Nie widziałem, aby nikt nie opublikował pełnego rozwiązania zadanego przykładowego problemu. Mam nadzieję, że to wystarczające wyjaśnienie.

import datetime

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

Wynik:

15/02/2010

1

Możesz to osiągnąć również za pomocą pand:

import pandas as pd

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

Wynik:

'15/02/2010'

Możesz zastosować podejście pandy do różnych typów danych, takich jak:

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)

Wynik:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.