2016-07-14 3 views
0
d = {'one':[datetime.datetime(3000, 6, 1, 0, 0), datetime.datetime(2016, 6, 1, 0, 0), datetime.datetime(2016, 7, 1, 0, 0), datetime.datetime(2016, 6, 1, 0, 0),], 'two':[1,2,3,4,5,6,7,8,9,10,11,12,13,14]} 

df = pd.DataFrame(d) 
print df 
df = df.set_index(['one']) 
print df 



ERROR: At 

df = df.set_index(['one']) 

ValueError: Unable to convert [datetime.datetime(3000, 6, 1, 0, 0) datetime.datetime(2016, 6, 1, 0, 0) datetime.datetime(2016, 7, 1, 0, 0) datetime.datetime(2016, 6, 1, 0, 0) datetime.datetime(2016, 7, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) atetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 6, 1, 0, 0) datetime.datetime(2016, 2, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0)] to datetime dtype 

Aber es funktioniert sehr gut mit Daten innerhalb von Jahren als 2000-2999.df.set_index() für Datetime-Objekte Listenspalte für zukünftige Daten nicht funktioniert.

Nicht sicher, was das Problem hier ist. Kann mir jemand dabei helfen?

Vielen Dank im Voraus.

  • Venkat

Antwort

1

Ihr Code wirft verschiedene Ausnahmen (a SyntaxError, ein ValueError: arrays must all be same length und ein pandas.tslib.OutOfBoundsDatetime: Out of bounds Fehler) für mich, aber ich denke, die letzte, die OutOfBoundsDatetime auf das gleiche Problem betrifft Sie sehen.

Beim Erstellen eines Datenrahmens aus Daten, die datumsähnliche Objekte enthalten, werden die Daten in NumPy datetime64[ns] dtype konvertiert. Zum Beispiel

import datetime as DT 
import pandas as pd 

df = pd.DataFrame({'one':[DT.datetime(2000, 6, 1, 0, 0), DT.datetime(2016, 6, 1, 0, 0), DT.datetime(2016, 7, 1, 0, 0), DT.datetime(2016, 6, 1, 0, 0),], 'two':[1,2,3,4]}) 

print(df.info()) 
# <class 'pandas.core.frame.DataFrame'> 
# RangeIndex: 4 entries, 0 to 3 
# Data columns (total 2 columns): 
# one 4 non-null datetime64[ns] # <-- Notice the dtype 
# two 4 non-null int64 
# dtypes: datetime64[ns](1), int64(1) 
# memory usage: 144.0 bytes 

Im Moment ist datetime64[ns] die only NumPy datetime64 data type supported von Pandas. The range of dates Dieser Datentyp kann [1678 AD, 2262 AD] darstellen. Daher tritt eine Ausnahme auf, wenn das Objekt datetime.datetime auf ein Datum außerhalb dieses Bereichs verweist.

1

Wie auf der pandas documentation erwähnt, Pandas Timestamp Objekte zum Jahr nur erreichen kann, 2262., aber the documentation also describes a way around this limitation.

Die Idee ist, dass wenn Sie die Nanosekunde Auflösung des datetime64 dtype nicht benötigen, können Sie ein verwenden können PeriodIndex um das gewünschte Ergebnis zu erzielen.

In Ihrem Fall sieht es aus wie Sie vielleicht etwas entlang der Linien wünschen können:

s = pd.Series([30000601, 20160601, 20160701, 20160501]) 
def conv(x): 
    return pd.Period(year = x // 10000, month = x//100 % 100, day = x%100, freq='D') 
span = pd.PeriodIndex(s.apply(conv)) 
df.index = span 
0

Endlich habe ich es zu arbeiten.

s = pd.Series([30000601, 20160601, 20160701, 20160501]) 
def conv(x): 
    return pd.Period(year = x // 10000, month = x//100 % 100, day = x%100,  freq='D') 
span = pd.PeriodIndex(s.apply(conv)) 
df.index = span 

Vielen Dank für die Hilfe.