2017-11-28 3 views
1

Ich habe ein großes Array von Datetime-Objekten in numpy Array. Ich versuche jedoch, sie als JSON-Objektattribut zu exportieren, und sie müssen als eine UTC-Zeichenfolge dargestellt werden.Konvertieren numpy Array von Datetime-Objekten in UTC-Strings

Hier ist meine Array (ein kleines Stück davon)

datetimes = [datetime.datetime(2015, 7, 12, 18, 33, 14, tzinfo=<UTC>), datetime.datetime(2015, 7, 12, 18, 33, 32, tzinfo=<UTC>), datetime.datetime(2015, 7, 12, 18, 33, 50, tzinfo=<UTC>)] 

json = { 
    'datetimes': [] 
}; 

Ich weiß, dass ich über die Liste laufen kann und wandeln sie aber ich hatte gehofft, dass es eine effiziente Pandas oder numpy Technik dafür war.

Antwort

1

Ich glaube, Sie DataFrame erstellen können, zu iso-Format konvertieren und zu dict sparen, weil DataFrame.to_json mit orint='list' ist not implemented yet:

datetimes = [datetime.datetime(2015, 7, 12, 18, 33, 14, tzinfo=datetime.timezone.utc), 
      datetime.datetime(2015, 7, 12, 18, 33, 32, tzinfo=datetime.timezone.utc), 
      datetime.datetime(2015, 7, 12, 18, 33, 50, tzinfo=datetime.timezone.utc)] 


df = pd.DataFrame({'datetimes': datetimes}) 
#native convert to iso, but not support lists yet 
print (df.to_json(date_format='iso')) 
{"datetimes":{"0":"2015-07-12T18:33:14.000Z", 
       "1":"2015-07-12T18:33:32.000Z", 
       "2":"2015-07-12T18:33:50.000Z"}} 

df = pd.DataFrame({'datetimes': datetimes}) 
df['datetimes'] = df['datetimes'].map(lambda x: x.isoformat()) 
print (json.dumps(df.to_dict(orient='l'))) 
{"datetimes": ["2015-07-12T18:33:14+00:00", 
       "2015-07-12T18:33:32+00:00", 
       "2015-07-12T18:33:50+00:00"]} 

print(json.dumps({'datetimes': [x.isoformat() for x in datetimes]})) 
{"datetimes": ["2015-07-12T18:33:14+00:00", 
       "2015-07-12T18:33:32+00:00", 
       "2015-07-12T18:33:50+00:00"]} 

Ich teste es mehr und Liste Verständnis ist am schnellsten mit isoformat:

datetimes = [datetime.datetime(2015, 7, 12, 18, 33, 14, tzinfo=datetime.timezone.utc), 
      datetime.datetime(2015, 7, 12, 18, 33, 32, tzinfo=datetime.timezone.utc), 
      datetime.datetime(2015, 7, 12, 18, 33, 50, tzinfo=datetime.timezone.utc)]*10000 

In [116]: %%timeit 
    ...: df = pd.DataFrame({'datetimes': datetimes}) 
    ...: df['datetimes'] = df['datetimes'].map(lambda x: x.isoformat()) 
    ...: json.dumps(df.to_dict(orient='l')) 
    ...: 
1 loop, best of 3: 552 ms per loop 

#wrong output format, dictionaries not lists 
In [117]: %%timeit 
    ...: df = pd.DataFrame({'datetimes': datetimes}) 
    ...: df.to_json(date_format='iso') 
    ...: 
10 loops, best of 3: 104 ms per loop 

In [118]: %%timeit 
    ...: json.dumps({'datetimes': [x.isoformat() for x in datetimes]}) 
    ...: 
10 loops, best of 3: 67.5 ms per loop 
+0

Das sieht fantastisch aus. Ich werde so schnell wie möglich überprüfen und markieren. Vielen Dank. Ich schätze Ihre Hilfe und Unterstützung sehr. –

+0

Ya, nicht einfach Zeitzone problematisch;) Danke. – jezrael

Verwandte Themen