2016-07-14 65 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 

但它工作很好,日期在2000年至2000年的年份內。df.set_index()在日期時間對象列表列中,未來日期不起作用。

不知道這裏有什麼問題。有人可以幫助我嗎?

在此先感謝。

  • Venkat

回答

1

代碼中引發了我不同的例外情況(一SyntaxError,一個ValueError: arrays must all be same lengthpandas.tslib.OutOfBoundsDatetime: Out of bounds錯誤),但我覺得最後一個,OutOfBoundsDatetime是指你所看到的同樣的問題。

當從包含類日期對象的數據構建DataFrame時,日期將轉換爲NumPy dtype。例如,

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 

目前,datetime64[ns]only NumPy datetime64 data type supported的熊貓。 The range of dates該數據類型可以表示爲[1678 AD, 2262 AD]。因此,如果datetime.datetime對象引用此範圍之外的日期,則會發生異常。

1

由於在pandas documentation提到,熊貓Timestamp對象只能達到一年2262然而,the documentation also describes a way around this limitation.

的想法是,如果你不需要datetime64 D型的納秒分辨率,可以使用PeriodIndex以實現期望的結果。

在你的情況下,它看起來像你可能想沿着線的東西:

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

最後我得到了它的工作。

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 

謝謝你的幫助。

相關問題