2016-08-01 20 views
3

Ich habe eine Zeitreihe, die ich aus einer netCDF-Datei gezogen habe, und ich versuche, sie in ein Datetime-Format zu konvertieren. Das Format der Zeitreihe ist in 'Tagen seit 1990-01-01 00.00.00 10' (+10 seinem GMT: +10)Python: Tage seit 1990 in Datetime-Objekt konvertieren

time = nc_data.variables['time'][:] 
time_idx = 0 # first timestamp 
print time[time_idx] 

9465.0 

Meine gewünschte Ausgabe ein Datetime-Objekt wie so ist (auch GMT +10):

2015-12-01 00:00:00 

habe ich versucht, die Umwandlung dieser Zeit Modul ohne viel Erfolg mit, obwohl ich glaube, dass ich falsch verwendet werden kann (ich bin noch ein Neuling in python und Programmierung).

import time 
time_datetime = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(time[time_idx]*24*60*60)) 

Jede Beratung schätzen, Prost!

Antwort

3

Das Modul timedelta ist wahrscheinlich, was Sie suchen.

Zum Beispiel:

from datetime import date, timedelta 

days = 9465     # This may work for floats in general, but using integers 
          # is more precise (e.g. days = int(9465.0)) 

start = date(1990,1,1)  # This is the "days since" part 

delta = timedelta(days)  # Create a time delta object from the number of days 

offset = start + delta  # Add the specified number of days to 1990 

print(offset)    # >>> 2015-12-01 
print(type(offset))   # >>> <class 'datetime.date'> 

können Sie dann verwenden und/oder das Offset-Objekt zu manipulieren, oder in einer String-Darstellung konvertieren aber Sie sehen, passen.

Sie können das gleiche Format wie für dieses Date-Objekt verwenden, wie Sie für Ihre time_datetime tun:

print(offset.strftime('%Y-%m-%d %H:%M:%S')) 

Ausgang:

2015-12-01 00:00:00 

Statt ein date Objekt zu verwenden, könnten Sie Verwenden Sie stattdessen ein Objekt datetime, wenn Sie später beispielsweise Stunden/Minuten/Sekunden/Zeitzonenoffsets hinzufügen würden.

würde der Code das gleiche wie oben, mit Ausnahme von zwei Linien bleiben:

# Here, you're importing datetime instead of date 
from datetime import datetime, timedelta 

# Here, you're creating a datetime object instead of a date object 
start = datetime(1990,1,1) # This is the "days since" part 

Hinweis: Obwohl Sie sagen, es nicht, aber die andere Antwort empfehlen Sie für Zeitzone suchen könnten bewusst Datumsangaben. Wenn das der Fall ist, ist dateutil der Weg in Python 2 zu gehen, wie die andere Antwort vorschlägt. In Python 3 möchten Sie datetimetzinfo des Moduls verwenden.

+0

Danke für ausführliche Antwort! Das Datetime-Objekt wird bevorzugt, da für jede Stunde im Dezember Zeitstempel vorhanden sind. –

+0

Großartig glücklich es half - und glücklich, dass ich dann das :) – jedwards

2

Wir können dies in ein paar Schritten tun. Zuerst werden wir die dateutil Bibliothek verwenden, um unsere Arbeit zu erledigen. Es wird einiges leichter machen.

Der erste Schritt besteht darin, ein Objekt datetime aus Ihrer Zeichenfolge (1990-01-01 00:00:00 +10) zu erhalten. Wir werden tun, dass mit dem folgenden Code:

from datetime import datetime 
from dateutil.relativedelta import relativedelta 
import dateutil.parser 

days_since = '1990-01-01 00:00:00 +10' 
days_since_dt = dateutil.parser.parse(days_since) 

Nun, unsere days_since_dt werden wie folgt aussehen:

datetime.datetime(1990, 1, 1, 0, 0, tzinfo=tzoffset(None, 36000)) 

wir, dass im nächsten Schritt verwenden werden, der das neue Datum zu bestimmen. Wir verwenden relativedelta in dateutils, um diese Mathematik zu verarbeiten.

new_date = days_since_dt + relativedelta(days=9465.0) 

Dies wird in new_date im Wert führt mit einem Wert von:

datetime.datetime(2015, 12, 1, 0, 0, tzinfo=tzoffset(None, 36000)) 

Diese Methode stellt sicher, dass die Antwort, die Sie erhalten in GMT + 10 bleibt.

+0

Dank Andy, die Dateutil-Bibliothek ist ein großartiges Werkzeug, das ich nicht wusste. –

2

netCDF num2date ist die korrekte Funktion hier zu verwenden:

import netCDF4 

ncfile = netCDF4.Dataset('./foo.nc', 'r') 
time = ncfile.variables['time'] # do not cast to numpy array yet 
time_convert = netCDF4.num2date(time[:], time.units, time.calendar) 

Diese Anzahl von Tagen zu konvertieren, da 1900-01-01 (das heißt die units von time) zu Python Datetime-Objekte. Wenn time kein Attribut calendar aufweist, müssen Sie den Kalender angeben oder den Standardwert verwenden.