2016-05-23 7 views
1

Der Konstruktor der Pandas-Serie erzeugt NaN-Werte, wenn ein Wörterbuch übergeben wird, in dem der Schlüssel ein Tupel mit einem der Elemente als Datetime ist. Der Code ist unten.Konstruktor der Pandas-Serie erzeugt NaN-Werte

Seltsamerweise passiert es nicht, wenn der Schlüssel ein einzelnes Datetime oder ein Tupel ohne Datetimes ist.

Es scheint, dieses Verhalten wurde in Pandas 0.15.0 eingeführt, da es in 0.14.1 funktioniert, aber ich kann nichts in den Versionshinweisen finden.

Ich verwende 64-Bit Python 2.7 unter Windows.

Jede Hilfe wird geschätzt.

import datetime 
import pandas as pd 

d = { 
    (datetime.date(2016, 5, 1), 'k1'): 1, 
    (datetime.date(2016, 5, 2), 'k2'): 2 
} 

print 'Dictionary:' 
print d 
print 

s = pd.Series(d) 
print 'Series:' 
print s 
print 

df = pd.DataFrame(d.values(), index=pd.MultiIndex.from_tuples(d.keys())) 
print 'DataFrame:' 
print df 
print 

Ausgang:

Dictionary: 
{(datetime.date(2016, 5, 1), 'k1'): 1, (datetime.date(2016, 5, 2), 'k2'): 2} 

Series: 
2016-05-01 k1 NaN 
2016-05-02 k2 NaN 
dtype: float64 

DataFrame: 
       0 
2016-05-01 k1 1 
2016-05-02 k2 2 
+0

Ja, das ist seltsam. Ich bekomme das gleiche Verhalten wie bei der Verwendung von 'datetime.date', aber es funktioniert wie geschrieben, wenn ich stattdessen 'datetime.datetime' verwende. Wenn Sie den Index in der Ausgabe 'NaN' betrachten, hat Pandas jedem Datum eine Zeitkomponente hinzugefügt. Vielleicht gibt es einen Fehler, wo es diese Konvertierung macht? – root

+0

iirc das wurde in 0.18.0 behoben (könnte auch in 0.17.1 sein) – Jeff

+1

@Jeff Ich benutze 0.18.1 und sehe das gleiche Verhalten. – root

Antwort

1

Das ist bizarr! Muss ein Fehler sein.

Hier sind einige meiner Versuche:

Was du getan hast:

s = pd.Series({(datetime.date(2016, 5, 1), 'k1'): 1, 
       (datetime.date(2016, 5, 2), 'k2'): 2}) 

s 

2016-05-01 k1 NaN 
2016-05-02 k2 NaN 
dtype: float64 

Experiment # 1: Verwendung strftime eine Zeichenfolge zurück, nicht das, was Sie wollen. Aber funktioniert.

s = pd.Series({(datetime.date(2016, 5, 1).strftime('%Y-%m-%d'), 'k1'): 1, 
       (datetime.date(2016, 5, 2).strftime('%Y-%m-%d'), 'k2'): 2}) 

s 

2016-05-01 k1 1 
2016-05-02 k2 2 
dtype: int64 

Experiment # 2: pd.to_datetime verwenden. Dies funktioniert

s = pd.Series({(pd.to_datetime(datetime.date(2016, 5, 1)).strftime('%Y-%m-%d'), 'k1'): 1, 
       (pd.to_datetime(datetime.date(2016, 5, 2)).strftime('%Y-%m-%d'), 'k2'): 2}) 

s 

2016-05-01 k1 1 
2016-05-02 k2 2 
dtype: int64 

Experiment # 3: pd.Timestamp verwenden. Das funktioniert auch

s = pd.Series({(pd.Timestamp(datetime.date(2016, 5, 1)), 'k1'): 1, 
       (pd. Timestamp(datetime.date(2016, 5, 2)), 'k2'): 2}) 

s 

2016-05-01 k1 1 
2016-05-02 k2 2 
dtype: int64