如何从以时间戳为索引的记录创建数据框?

问题描述

我正在尝试创建一个数据帧,其中我将时间戳记作为索引,但是会引发错误。如果索引不是时间戳,我可以使用相同的方法来创建数据框。以下代码位是一个简短的示例:

工作正常

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)