611 Stimmen

Wie übersetze ich eine ISO 8601 datetime Zeichenfolge in ein Python datetime Objekt?

Ich erhalte eine Datumszeichenfolge im Format "2009-05-28T16:15:00" (ich glaube, das ist ISO 8601). Eine hackish Option scheint zu sein, die Zeichenfolge zu parsen mit time.strptime und Übergabe der ersten sechs Elemente des Tupels an den datetime-Konstruktor, wie:

datetime.datetime(*time.strptime("2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S")[:6])

Ich habe keine "saubere" Methode gefunden, dies zu tun. Gibt es eine?

28 Stimmen

Es ist zu bedenken, dass es sich nicht um ziemlich ein Duplikat des Problems, gegen das es geschlossen wurde. Das verlinkte Problem bezieht sich speziell auf RFC 3339 Zeichenketten, während diese sich auf ISO 8601-Zeichenketten bezieht. Die RFC 3339-Syntax ist eine Untermenge der ISO 8601-Syntax (die in der nicht kostenlosen ISO 8601-Norm definiert ist, die Sie, wie die meisten ISO-Normen, entweder raubkopieren oder eine hohe Gebühr bezahlen müssen, um sie zu lesen). Der in dieser Frage gezeigte Datumsstring ist ein ISO 8601 Datumsstring, aber KEIN RFC 3339 Datumsstring. UTC-Offsets sind in RFC 3339-Datetimes obligatorisch, und hier ist keiner vorgesehen.

6voto

billmanH Punkte 1051

In beide Richtungen:

Epoche bis ISO-Zeit:

isoTime = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(epochTime))

ISO-Zeit bis Epoch:

epochTime = time.mktime(time.strptime(isoTime, '%Y-%m-%dT%H:%M:%SZ'))

2 Stimmen

Aber Sie sind nur auf UTC beschränkt (z)

2 Stimmen

Analysiert weder dezimale Sekunden noch Zeitzonen (mit Ausnahme von "Z")

0 Stimmen

Guter Punkt, aber Sie könnten die Textstring-Parameter ändern, um Ihr spezifisches Format anzupassen. docs.python.org/2/Bibliothek/time.html Sie müssen die Zeichenkette nur an Ihre Eingaben anpassen.

5voto

Tobu Punkte 23823

Isodat scheint die umfassendste Unterstützung zu haben.

2 Stimmen

Wäre die Syntax: dt = isodate.parse_datetime(ts)

4voto

user3310495 Punkte 1

aniso8601 sollte dies übernehmen. Es versteht auch Zeitzonen, Python 2 und Python 3, und es hat eine angemessene Abdeckung des Restes von ISO 8601 falls Sie sie jemals brauchen sollten.

import aniso8601
aniso8601.parse_datetime('2007-03-04T21:08:12')

-17voto

Joseph Roten Punkte 19

Hier ist eine super einfache Möglichkeit, diese Art von Konvertierungen durchzuführen. Kein Parsing, oder zusätzliche Bibliotheken erforderlich. Es ist sauber, einfach und schnell.

import datetime
import time

################################################
#
# Takes the time (in seconds),
#   and returns a string of the time in ISO8601 format.
# Note: Timezone is UTC
#
################################################

def TimeToISO8601(seconds):
   strKv = datetime.datetime.fromtimestamp(seconds).strftime('%Y-%m-%d')
   strKv = strKv + "T"
   strKv = strKv + datetime.datetime.fromtimestamp(seconds).strftime('%H:%M:%S')
   strKv = strKv +"Z"
   return strKv

################################################
#
# Takes a string of the time in ISO8601 format,
#   and returns the time (in seconds).
# Note: Timezone is UTC
#
################################################

def ISO8601ToTime(strISOTime):
   K1 = 0
   K2 = 9999999999
   K3 = 0
   counter = 0
   while counter < 95:
     K3 = (K1 + K2) / 2
     strK4 = TimeToISO8601(K3)
     if strK4 < strISOTime:
       K1 = K3
     if strK4 > strISOTime:
       K2 = K3
     counter = counter + 1
   return K3

################################################
#
# Takes a string of the time in ISO8601 (UTC) format,
#   and returns a python DateTime object.
# Note: returned value is your local time zone.
#
################################################

def ISO8601ToDateTime(strISOTime):
   return time.gmtime(ISO8601ToTime(strISOTime))

#To test:
Test = "2014-09-27T12:05:06.9876"
print ("The test value is: " + Test)
Ans = ISO8601ToTime(Test)
print ("The answer in seconds is: " + str(Ans))
print ("And a Python datetime object is: " + str(ISO8601ToDateTime(Test)))

11 Stimmen

Kein Parsing ? Sauber ? Schnell ? Was sind das für hartkodierte Werte wie 9999999999? 95? Besser eine Bibliothek verwenden ...

4 Stimmen

Das ist weder einfach noch sauber und sicherlich langsamer als alle anderen vorgeschlagenen Antworten...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X