2013-04-10 17 views
1

我試圖通過傳遞包含索引和數據對的字典來構建Pandas系列。當我這樣做時,我注意到一個有趣的怪癖。如果數據對的索引是非常大的整數,則數據將顯示爲NaN。這可以通過減小索引值的大小來解決,也可以使用兩個列表而不是單個字典來創建系列。我有很大的索引值,因爲我使用1970年以來的微秒格式的時間戳。我做錯了什麼或者這是一個錯誤?Python Pandas系列在傳遞帶有大索引值的字典時給出了NaN數據

下面是一個例子:

import pandas as pd 

test_series_time = [1357230060000000, 1357230180000000, 1357230300000000] 
test_series_value = [1, 2, 3] 
series = pd.Series(test_series_value, test_series_time, name="this works") 

test_series_dict = {1357230060000000: 1, 1357230180000000: 2, 1357230300000000: 3} 
series2 = pd.Series(test_series_dict, name="this doesn't") 

test_series_dict_smaller_index = {1357230060: 1, 1357230180: 2, 1357230300: 3} 
series3 = pd.Series(test_series_dict_smaller_index, name="this does") 

print series 
print series2 
print series3 

和輸出:

1357230060000000 1 
1357230180000000 2 
1357230300000000 3 
Name: this works 

1357230060000000 NaN 
1357230180000000 NaN 
1357230300000000 NaN 
Name: this doesn't 

1357230060 1 
1357230180 2 
1357230300 3 
Name: this does 

那麼什麼是本?

回答

0

我敢打賭,你是在32位;在64位這工作正常。在0.10.1中,通過dicts創建的默認值是使用默認的numpy整數創建,這是與系統有關的(例如,32位爲int32,64位爲int64)。你正在溢出dtype,這會導致不可預知的行爲。

在0.11(本週出來!),這將工作,因爲它將默認創建int64s,無論系統。

In [12]: np.iinfo(np.int32).max 
Out[12]: 2147483647 

In [13]: np.iinfo(np.int64).max 
Out[13]: 9223372036854775807 

將您的微秒時間戳(乘以1000就擺在納秒這是什麼時間戳接受作爲整數輸入,那麼你是好去

In [5]: pd.Series(test_series_value, 
     [ pd.Timestamp(k*1000) for k in test_series_time ]) 
Out[5]: 
2013-01-03 16:21:00 1 
2013-01-03 16:23:00 2 
2013-01-03 16:25:00 3 
+0

這是有道理的,我跑了32位版本,感謝您的好解釋!期待新版本。 – Dsyko 2013-04-12 06:39:38

相關問題