问题描述
我正在尝试创建一个数据帧,其中我将时间戳记作为索引,但是会引发错误。如果索引不是时间戳,我可以使用相同的方法来创建数据框。以下代码位是一个简短的示例:
工作正常:
pd.DataFrame.from_dict({'1':{'a':1,'b':2,'c':3},'2':{'a':1,'c':4},'3':{'b':6}})
输出:
1 2 3
a 1 1.0 NaN
b 2 NaN 6.0
c 3 4.0 NaN
BREAKS
o=np.arange(np.datetime64('2017-11-01 00:00:00'),np.datetime64('2017-11-01 00:00:00')+np.timedelta64(3,'D'),np.timedelta64(1,'D'))
pd.DataFrame.from_records({o[0]:{'a':1,o[1]:{'a':1,o[2]:{'b':6}})
输出:
KeyError Traceback (most recent call last)
<ipython-input-627-f9a075f611c0> in <module>
1 o=np.arange(np.datetime64('2017-11-01 00:00:00'),'D'))
2
----> 3 pd.DataFrame.from_records({o[0]:{'a':1,o[2]:{'b':6}})
~/anaconda3/envs/dfs/lib/python3.6/site-packages/pandas/core/frame.py in from_records(cls,data,index,exclude,columns,coerce_float,nrows)
1617 if columns is None:
1618 columns = arr_columns = ensure_index(sorted(data))
-> 1619 arrays = [data[k] for k in columns]
1620 else:
1621 arrays = []
~/anaconda3/envs/dfs/lib/python3.6/site-packages/pandas/core/frame.py in <listcomp>(.0)
1617 if columns is None:
1618 columns = arr_columns = ensure_index(sorted(data))
-> 1619 arrays = [data[k] for k in columns]
1620 else:
1621 arrays = []
KeyError: Timestamp('2017-11-01 00:00:00')
请帮助我了解行为以及我所缺少的内容。另外,如何从以时间戳为索引的记录中创建数据框
解决方法
将 from_records 更改为 from_dict (就像您的工作示例一样) 一切执行正常。
另一个可选提示:由于您创建了 Pandas 数据框,因此请使用 pandasonic 本机创建 datetime 值以用作列名的方法:
o = pd.date_range(start='2017-11-01',periods=3)
编辑
我注意到,如果您按照我提议的方式创建 o 对象(作为 date_range ),甚至可以使用 from_records 。
编辑2
您写道,您想将 datetime 对象用作 index ,而 您的代码尝试将它们设置为列名。
如果要将 datetime 对象用作索引,请运行以下命令:
df = pd.DataFrame.from_records({'1':{o[0]:1,o[1]:2,o[2]:3},'2':{o[0]:1,o[2]:4},'3':{o[1]:6}})
结果是:
1 2 3
2017-11-01 1 1.0 NaN
2017-11-02 2 NaN 6.0
2017-11-03 3 4.0 NaN
创建上述结果的另一种方法是:
df = pd.DataFrame.from_records([{'1':1,'2':1},{'1':2,'3':6},{'1':3,'2':4}],index=o)