Python Pandas Series在传递具有大索引值的dict时提供NaN数据

时间:2013-04-10 00:10:22

标签: dictionary python-2.7 pandas series

我正在尝试通过传递包含索引和数据对的字典来构建Pandas系列。在这样做的同时,我注意到了一个有趣的怪癖。如果数据对的索引是一个非常大的整数,则数据将显示为NaN。通过减小索引值的大小或使用两个列表而不是单个dict创建Series来解决此问题。我有大的索引值,因为我使用自1970年以来的微秒格式的时间戳。我做错了还是这个错误?

以下是一个例子:

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

那么这是怎么回事?

1 个答案:

答案 0 :(得分:0)

我打赌你是32位的;在64位这工作正常。在0.10.1中,通过dicts创建的默认值是使用默认的numpy整数创建,它是系统相关的(例如32位的int32和64位的int64)。你正在溢出dtype,导致不可预测的行为。

在0.11(本周推出!)中,这将起作用,因为无论系统如何,它都将默认创建int64。

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

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

将你的微秒转换为Timestamps(乘以1000以加入纳秒,这是Timestamp接受的整数输入,那么你很高兴

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