Mam ogromną listę dat, takich jak ciągi znaków:
Jun 1 2005 1:33PM
Aug 28 1999 12:00AM
Zamieszczę je z powrotem w odpowiednie pola daty i godziny w bazie danych, więc muszę je magicznie przekształcić w prawdziwe obiekty datetime.
Przechodzi przez ORM Django, więc nie mogę użyć SQL do konwersji na insert.
strptime()
doprowadzi cię do szału, chyba że go owiniesz. Zobacz moją odpowiedź na podstawie odpowiedzi Or Weis na ten tematOdpowiedzi:
datetime.strptime
jest główną procedurą do analizowania ciągów w czasie danych. Może obsługiwać wszystkie rodzaje formatów, przy czym format określa ciąg formatu, który mu podasz:Powstały
datetime
obiekt jest naiwny dla strefy czasowej.Spinki do mankietów:
Dokumentacja Pythona dla
strptime
: Python 2 , Python 3Dokumentacja Pythona dla łańcuchów
strptime
/strftime
format: Python 2 , Python 3strftime.org to także bardzo miłe odniesienie do strftime
Uwagi:
strptime
= "ciąg parsowania czasu"strftime
= „czas formatu ciągu”źródło
date
zamiastdatetime
,datetime
to dobrze go sobie radzi:datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
datetime
obiekt świadomy strefy czasowej, dodając ten wiersz w Pythonie 3:from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
"%Y-%m-%d %H:%M:%S"
from datetime import datetime
zamiast po prostuimport datetime
.Użyj biblioteki dateutil innej firmy :
Obsługuje większość formatów dat, w tym ten, który musisz przeanalizować. Jest to wygodniejsze niż
strptime
może przez większość czasu odgadnąć właściwy format.Jest to bardzo przydatne do pisania testów, w których czytelność jest ważniejsza niż wydajność.
Możesz go zainstalować za pomocą:
źródło
Sprawdź strptime w module czasu . To jest odwrotność strftime .
źródło
Przygotowałem projekt, który potrafi przekształcić niektóre naprawdę fajne wyrażenia. Sprawdź rozkład czasowy .
Oto kilka przykładów poniżej:
pip install timestring
źródło
import timestring
timestring.Date('27 Mar 2014 12:32:29 GMT').year
Ta biblioteka sprawiła, że było to TAK ŁATWE! Dziękuję Ci.2017-02-01
. To samo dla 5 lutego 2017 r. (Jednak robi to poprawnie 5 lutego 2017 r.); żaden z tych dwóch ostatnich nie jest formatem, który kiedykolwiek widziałem przyzwyczajony do mojej wiedzy, ale pomyślałem, że i tak to zwrócę.Date("20180912")
jakiś sposób analizuje wartość2018-11-21
. Używaj na własne ryzyko.Pamiętaj o tym i nie musiałeś się ponownie mylić podczas konwersji daty i godziny.
Ciąg do obiektu datetime =
strptime
obiekt datetime do innych formatów =
strftime
Jun 1 2005 1:33PM
jest równe
%b %d %Y %I:%M%p
więc potrzebujesz strptime, czyli konwersji
string
doWynik
Co zrobić, jeśli masz inny format dat, możesz użyć panda lub dateutil.parse
Wynik
źródło
%b
złamie się, jeśli parsujesz angielską datę na maszynie, która nie ma angielskich ustawień regionalnych?W Pythonie> = 3.7.0
Aby przekonwertować YYYY-MM-DD datetime ciąg do obiektu ,
datetime.fromisoformat
mogą być wykorzystane.źródło
Wiele znaczników czasu ma domyślną strefę czasową. Aby mieć pewność, że Twój kod będzie działał w każdej strefie czasowej, powinieneś używać UTC wewnętrznie i dołączać strefę czasową za każdym razem, gdy obcy obiekt wchodzi do systemu.
Python 3.2+:
źródło
mktime()
podczas przejścia DST) pierwszą metodę, jeśli znasz drugą metodę (datetime.strptime()
)? Jeśli chcesz uniknąć wyjątku podczas sekundy przestępnej (druga metoda zawodzi), możeszcalendar.timegm
zamiast tego użyć :(datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3)))
Oto dwa rozwiązania wykorzystujące Pandy do konwertowania dat sformatowanych jako ciągi na obiekty datetime.date.
Czasy
A oto jak przekonwertować oryginalne przykłady daty i godziny OP:
Istnieje wiele opcji konwersji ciągów znaków za pomocą znaczników czasu Pandas
to_datetime
, więc sprawdź dokumenty, jeśli potrzebujesz czegoś specjalnego.Podobnie znaczniki czasu mają wiele właściwości i metod, do których można uzyskać dostęp oprócz
.date
źródło
Osobiście podoba mi się rozwiązanie wykorzystujące
parser
moduł, który jest drugą odpowiedzią na to pytanie i jest piękny, ponieważ nie trzeba budować żadnych literałów łańcuchowych, aby działało. ALE , jedną wadą jest to, że jest o 90% wolniejsza niż przyjęta odpowiedźstrptime
.Tak długo, jak nie robisz tego milion razy, wciąż uważam, że
parser
metoda jest wygodniejsza i automatycznie obsłuży większość formatów czasowych.źródło
Coś, co nie zostało tutaj wymienione i jest przydatne: dodanie sufiksu do dnia. Odsprzęgłem logikę sufiksu, abyś mógł używać jej do dowolnej liczby, a nie tylko dat.
źródło
źródło
Przykład obiektu daty / godziny rozpoznającego strefę czasową Django.
Ta konwersja jest bardzo ważna dla Django i Pythona, gdy masz
USE_TZ = True
:źródło
Utwórz małą funkcję narzędzia, taką jak:
Jest to wystarczająco wszechstronne:
źródło
format
jest zastrzeżonym słowem w pythonie i nie należy go używać jako nazwy zmiennej.Przydałoby się to do konwersji ciągu na datę i godzinę, a także do strefy czasowej
źródło
strzałka oferuje wiele przydatnych funkcji dla dat i godzin. Ten fragment kodu stanowi odpowiedź na pytanie i pokazuje, że strzałka jest również w stanie łatwo formatować daty i wyświetlać informacje o innych lokalizacjach.
Zobacz http://arrow.readthedocs.io/en/latest/, aby uzyskać więcej.
źródło
Aby ułatwić, możesz użyć easy_date :
źródło
Jeśli chcesz tylko format daty, możesz go ręcznie przekonwertować, przekazując poszczególne pola, takie jak:
Możesz przekazać wartości podzielonego ciągu, aby przekonwertować go na typ daty, taki jak:
Otrzymasz wynikową wartość w formacie daty.
źródło
Możesz także sprawdzić
dateparser
Zainstalować:
To, moim zdaniem, najłatwiejszy sposób na parsowanie dat.
Przykładowy kod:
Wynik:
źródło
Zobacz moją odpowiedź .
W rzeczywistych danych jest to prawdziwy problem: wiele niedopasowanych, niekompletnych, niespójnych i wielojęzycznych formatów daty / regionu, często dowolnie mieszanych w jednym zbiorze danych. Nie jest w porządku, aby kod produkcyjny zawiódł, nie mówiąc już o wyjściu szczęśliwym jak lis.
Musimy spróbować ... złapać wiele formatów datetime fmt1, fmt2, ..., fmtn i ukryć / obsłużyć wyjątki (od
strptime()
) dla wszystkich tych, którzy są niedopasowani (a w szczególności unikać potrzeby zawrotnej drabiny z głębokim wcięciem n .. klauzule catch). Z mojego rozwiązaniaźródło
pokazuje kolumnę „Data rozpoczęcia Godzina” i „Czas ostatniego logowania” w ramce danych są to „object = strings”
Korzystając ze wspomnianej
parse_dates
opcjiread_csv
, możesz przekonwertować ciąg datetime na format panda datetime.źródło