从 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
您可以确认s
是Series
:
In [2]: isinstance(s, pd.Series)
Out[2]: True
【讨论】:
啊,太好了。我错过了索引被用于选择的微妙之处,而是将其视为“用这些 N 个标签标记这 N 个事物”。更正了 df/test 错字。以上是关于从 Pandas DataFrame 创建时间序列的主要内容,如果未能解决你的问题,请参考以下文章
从多个dicts创建一个pandas DataFrame [重复]
从深度嵌套的 JSON 创建 Pandas DataFrame