2016-09-03 4 views
1

Ich versuche, eine Dezimalstelle in ein Datetime-Objekt zu konvertieren, um nach den Monaten zu suchen, um später die Zeit in Jahreszeiten zu teilen. Ich tat etwas Forschung und stolperte über datetime.datetime.fromtimestamp aber alles, was ich versucht habe, erzeugt die folgenden Fehler:Konvertiere Zeit Dezimal zu Datetime-Objekt Python

    TypeError: 'datetime.datetime' object is not iterable 

In der Vergangenheit habe ich Pandas verwendet, um eine neue Zeit Array zu erstellen, aber nicht das Gefühl, dass ist am besten für meine gegebene Situation. Zur Zeit habe ich folgendes in meinem Code und habe es auch ohne die for-Schleife versucht, in der Hoffnung, dass ich vontimestamp() richtig arbeiten kann.

raw_time = (data.variables['time'].getValue()/float(365*24))+1800 #hours since 1800 
time = n.where((raw_time>=2006)&(time<=2016)) #our specific time interval 

annual_time = [] 
for i in raw_time[time]: 
    annual_time.extend(datetime.datetime.fromtimestamp(i)) 

Meine Zeit wurde aus als netCDF-Datei eingelesen und zur Zeit sieht wie folgt aus:

print raw_time[time] 
array([ 2006.05205479, 2006.1369863 , 2006.22191781, 2006.29863014, 
    2006.38356164, 2006.46575342, 2006.55068493, 2006.63287671, 
    2006.71780822, 2006.80273973, 2006.88493151, 2006.96986301, 
    2007.05205479, 2007.1369863 , 2007.22191781, 2007.29863014, 
    2007.38356164, 2007.46575342, 2007.55068493, 2007.63287671, 
    2007.71780822, 2007.80273973, 2007.88493151, 2007.96986301, 
    2008.05205479, 2008.1369863 , 2008.22191781, 2008.30136986, 
    2008.38630137, 2008.46849315, 2008.55342466, 2008.63561644, 
    2008.72054795, 2008.80547945, 2008.88767123, 2008.97260274, ...]) 
+0

Wie ist die Zeit mit der Zahl dargestellt - 2006 ist was und nach der Dezimalzahl (05205479) ist was? – wolframalpha

+0

2006 ist mein Startjahr und die Dezimalstelle ist danach der Monatsstempel. –

Antwort

0

Sie sollten netCDF4 num2datetime konvertieren verwenden sein sollen von numerischen Werten zu Datetime-Objekten.

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) 

Dies wird eine time_convert Array von Datetime-Objekten erstellen, die Sie mit dann arbeiten können Jahreszeit zu erzeugen, zum Beispiel.

+0

Das hat perfekt geklappt und tatsächlich meinen Code gekürzt! Danke für Ihre Hilfe. –

1

Die Fehlermeldung, da die Nutzung des Portals extend ist:

annual_time = [] 
for i in raw_time[time]: 
    annual_time.extend(datetime.datetime.fromtimestamp(i)) 

Liste.extend() wird verwendet, um eine andere Liste oder iterable zu nehmen und ihren Inhalt am Ende der Liste hinzuzufügen. datetime gibt keine Liste oder iterable zurück; Es gibt eine Datetime-Instanz zurück. Für skalare Werte, müssen Sie append verwenden:

annual_time = [] 
for i in raw_time[time]: 
    annual_time.append(datetime.datetime.fromtimestamp(i)) 

auch sagen, dass ich glaube, Sie die Zeitwerte manipulieren müssen, bevor Sie diese Funktion verwenden, da die Werte, die Sie geben nicht aussehen wie Zeitstempel (die eine Anzahl von Sekunden nach 1. Januar 1970, 00.00.00 UTC) - es sei denn, diese Zeiten wirklich etwa eine halbe Stunde nach Mitternacht 1. Januar 1970 ...

+0

Meine Dezimalzahlen sind Monate ab Januar 1948. Also 2006.0520 ... ist Januar 2006, 2006.1369 ... ist Februar 2006, 2006.2219 ... ist März 2006 usw. Der Tag innerhalb des Monats oder der Tageszeit ist für mich irrelevant für diesen speziellen Umstand. Ich versuche, es in ein Datetime-Objekt zu konvertieren (wenn möglich), damit ich später nach Monat statt nach Dezimal suchen kann. Gibt es eine andere Funktion als die Zeitstempel? Ich persönlich habe nichts gefunden. –

+0

Wenn Sie sich nicht um die Zeit kümmern, können Sie einfach die Klasse "date" anstelle der Klasse "datetime" verwenden. Wie auch immer Sie sich entscheiden, Sie müssen das Jahr, den Monat und das Datum analysieren und direkt in den Klassenkonstruktor einspeisen, anstatt eine der Factory-Methoden zu verwenden: 'annual_time.append (datetime.date (year, month, dayofmonth)) ' –