我正在尝试通过传递包含索引和数据对的字典来构建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
那么这是怎么回事?
答案 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