从 Pandas DataFrame 创建时间序列

Posted

技术标签:

【中文标题】从 Pandas DataFrame 创建时间序列【英文标题】:Creating Time Series from Pandas DataFrame 【发布时间】:2017-09-28 06:21:10 【问题描述】:

我有一个具有各种属性的数据框,包括一个日期时间列。我想将其中一个属性列提取为由 datetime 列索引的时间序列。这看起来很简单,我可以用随机值构建时间序列,正如所有 pandas 文档所示。但是当我从数据框中这样做时,我的属性值都转换为 NaN。

这是一个类似的例子。

df = pd.DataFrame('a': [0,1], 'date':[pd.to_datetime('2017-04-01'),
                                       pd.to_datetime('2017-04-02')])
s = pd.Series(df.a, index=df.date)

在这种情况下,序列将具有正确的时间序列索引,但所有值都是 NaN。

我可以分两步完成该系列,如下所示,但我不明白为什么需要这样做。

s = pd.Series(df.a)
s.index = df.date

我错过了什么?我认为它与系列引用有关,但根本不明白为什么这些值会变为 NaN。

我还可以通过复制索引列来使其工作。

s = pd.Series(df.a, df.date.copy())

【问题讨论】:

【参考方案1】:

问题是pd.Series() 试图使用index 中指定的值从数据框中选择值,但数据框中的日期值不存在于索引中。

您可以将索引设置为日期列,然后选择您想要的一个数据列。这将返回一个以日期为索引的系列

import pandas as pd

df = pd.DataFrame('a': [0,1], 'date':[pd.to_datetime('2017-04-01'),
                                       pd.to_datetime('2017-04-02')])    
s = df.set_index('date')['a']

检查s 给出:

In [1]: s
Out[1]: 
date
2017-04-01    0
2017-04-02    1
Name: a, dtype: int64

您可以确认sSeries

In [2]: isinstance(s, pd.Series)
Out[2]: True

【讨论】:

啊,太好了。我错过了索引被用于选择的微妙之处,而是将其视为“用这些 N 个标签标记这 N 个事物”。更正了 df/test 错字。

以上是关于从 Pandas DataFrame 创建时间序列的主要内容,如果未能解决你的问题,请参考以下文章

从字符串创建 Pandas DataFrame

从字典创建 Pandas DataFrame

从多个dicts创建一个pandas DataFrame [重复]

从深度嵌套的 JSON 创建 Pandas DataFrame

如何从带有列表的嵌套 Json 创建 pandas DataFrame

如何使用 Pandas 从 DataFrame 或 np.array 中的列条目创建字典