【问题标题】:How to create a dataframe from records that has Timestamps as index?如何从以时间戳作为索引的记录创建数据框?
【发布时间】:2020-08-18 18:50:45
【问题描述】:

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

工作正常

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

休息

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,'b':2,'c':3},o[1]:{'a':1,'c':4},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'),np.datetime64('2017-11-01 00:00:00')+np.timedelta64(3,'D'),np.timedelta64(1,'D'))
      2 
----> 3 pd.DataFrame.from_records({o[0]:{'a':1,'b':2,'c':3},o[1]:{'a':1,'c':4},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')

请帮助我了解这种行为以及我缺少什么。另外,如何从以时间戳为索引的记录创建数据框

【问题讨论】:

  • 也许只是设置索引,pd.DataFrame.from_dict({'1':{'a':1,'b':2,'c':3},'2':{'a':1,'c':4},'3':{'b':6}}).set_index(o)?

标签: python-3.x numpy dictionary datetime python-datetime


【解决方案1】:

from_records 更改为 from_dict (就像在您的工作示例中一样) 一切正常。

另一个可选提示:由于您创建了 Pandas DataFrame,因此请使用 pandasonic 创建 datetime 值以用作列名的原生方式:

o = pd.date_range(start='2017-11-01', periods=3)

编辑

我注意到,如果您按照我建议的方式创建 o 对象(作为 date_range),你甚至可以使用 from_records

编辑 2

您写道您希望 datetime 对象作为 index,而 您的代码尝试将它们设置为列名

如果您希望 datetime 对象作为 index,请运行以下命令:

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)

【讨论】:

  • 1.时间对于这个练习至关重要,因此,我不会使用 pandas。我知道我可以创建 pandas 日期范围,然后可以在 from_records 中使用它。但是,时间限制再次发挥作用。我不能像你提到的那样修改字典,因为我只是在写一个下游软件,我会得到我提到的格式的记录。我的计划是使用转置
猜你喜欢
  • 2018-05-26
  • 2022-01-14
  • 2015-06-27
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多