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ć?

Nimmy
źródło
Duplikat tego wszystkiego: stackoverflow.com/search?q=%5Bpython%5D+parse+date . Dokładny duplikat tego: stackoverflow.com/questions/1713594/…
S.Lott

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'
>>>
SilentGhost
źródło
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
llazzaro
źródło
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'
ghostdog74
źródło
23

przekonwertuj ciąg na obiekt 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
źródło
Nie jest to zgodne z formatem, o który prosił, który zawierał ciąg miesiąca „luty”.
Shahir Ansari
@ShahirAnsari można zmienić format, jak chcesz odnieść „ docs.python.org/3/library/datetime.html
anjaneyulubatta505
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.

thavan
źródło
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'
ƘɌỈSƬƠƑ
źródło
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
Gobryas
źródło
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']
zwinny
źródło