【问题标题】:Constructing pandas dataframe from a list of objects从对象列表构造熊猫数据框
【发布时间】:2017-12-23 17:12:16
【问题描述】:

首先让我说我对 numpy 和 pandas 还很陌生。我正在尝试构建一个 pandas 数据框,但我不确定我是否以适当的方式做事。

我的设置是我有一个大的 .Net 对象列表(我几乎无法控制),我想使用 pandas 数据框从中构建一个时间序列。我有一个例子,我用一个简化的占位符类替换了 .Net 类,只是为了演示。代码中的listOfthings 基本上是我从.Net 得到的,我想把它转换成pandas 数据框。

我的问题是:

  1. 我首先构造一个 numpy 数组来构造数据帧。这是必要的吗?此外,这个数组没有我期望的大小 1000x2。有没有更好的方法在这里使用 numpy?
  2. 此代码不起作用,因为我似乎无法将字符串转换为 datetime64。这让我很困惑,因为字符串是 ISO 格式,当我尝试像这样解析它时它可以工作:np.datetime64(str(np.datetime64('now','us')))

代码示例:

import numpy as np
import pandas as pd

class PlaceholderClass:
    def time(self):
        return str(np.datetime64('now', 'us'))
    def value(self):
        return 100*np.random.random_sample()


listOfThings = [PlaceholderClass() for i in range(1000)]

arr = np.array([(x.time(), x.value()) for x in listOfThings], dtype=[('time', np.datetime64), ('value', np.float)])

dataframe = pd.DataFrame(data=arr['value'], index=arr['time'])

提前致谢

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    第一季度:

    我认为没有必要先创建一个 np.array 然后创建数据框。这工作得很好,例如:

    rd = lambda: datetime.date(randint(2005,2025), randint(1,12),randint(1,28))
    
    df = pd.DataFrame([(rd(), rd()) for x in range(100)])
    

    稍后添加:

    df = pd.DataFrame((x.value() for x in listOfThings), index=(pd.to_datetime(x.time()) for x in listOfThings))
    

    第二季度:

    我注意到 pd.to_datetime('some date') 几乎总是正确。即使没有指定格式。也许这会有所帮助。

    In [115]: pd.to_datetime('2008-09-22T13:57:31.2311892-04:00')
    Out[115]: Timestamp('2008-09-22 17:57:31.231189200')
    

    【讨论】:

    • 感谢您的回复@PandasRocks。但我不明白如何在我的情况下应用你的答案。鉴于我的示例中的ListOfThings,您能否演示如何构建以日期时间为索引的数据框?
    • @DoubleTrouble - 我添加了另一行。我认为您可以使用生成器语法,因此 Pandas 将动态创建索引和值。如果我没记错的话,Pandas 系列不同于 numpy 数组。
    猜你喜欢
    • 2020-12-20
    • 2015-12-12
    • 2015-07-31
    • 1970-01-01
    • 2018-04-27
    • 2023-02-03
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多