从对象列表构造pandas数据帧

问题描述 投票:1回答:1

让我先说我对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个回答
1
投票

Q1:

我认为没有必要首先创建一个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))

Q2:

我注意到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')
© www.soinside.com 2019 - 2024. All rights reserved.