使用 DatetimeIndex 选择数据的数据框

Posted

技术标签:

【中文标题】使用 DatetimeIndex 选择数据的数据框【英文标题】:data frame selecting data using a DatetimeIndex 【发布时间】:2019-07-10 17:31:25 【问题描述】:

我的数据框如下所示:

import numpy as np
import pandas as pd    

data = 'datetime' : ['2009-07-24 02:00:00', '2009-07-24 03:00:00','2009-07-24 04:00:00'],
     'value1' : ['a', np.nan ,'c'],
     'value2' : ['d','e','f']
df = pd.DataFrame(data)
df = df.set_index(pd.DatetimeIndex(df['datetime']))
missing = df.loc[:, df.columns != ('datetime')]
 

以上数据只是一个示例。但是假设我在更大的数据中有很多缺失值。我想选择“value1”列中所有缺失值的数据。

missing_index = df[df['value1'].isnull()].index

这段代码可以让我得到所有缺失值的索引,但我想要它们的实际行,在这种情况下是第二行。

所以,我试过了,

df[missing_index]

但我有一个错误提示

KeyError: "DatetimeIndex(['2009-07-24 03:00:00'], dtype='datetime64[ns]', name='datetime', freq=None) 不在索引中"

【问题讨论】:

df[df['value1'].isnull()] ? 【参考方案1】:

错误来自df[<something>] 用于获取列的事实。当您调用df[missing_index] 时,它会尝试在列中找到missing_index(这也是一个索引)。

正如@panktijk 在他的评论中指出的那样,做你想做的最简单的方法是:

df[df['value1'].isnull()]

但是,如果出于某种原因(也许您想操纵它们)您想按照自己的方式首先获取索引,然后使用这些索引来拉取您的子数据框,您可以执行以下操作:

df.loc[missing_index]

【讨论】:

【参考方案2】:

我正在使用索引来捕获行号:(从 0 开始)

import pandas as pd
import numpy as np

data = 'datetime' : ['2009-07-24 02:00:00', '2009-07-24 03:00:00','2009-07-24 04:00:00', '2009-07-24 05:00:00'],
     'value1' : ['a', np.nan ,'c', np.nan],
     'value2' : ['d','e','f', 'g']
df = pd.DataFrame(data)
df = df.set_index(pd.DatetimeIndex(df['datetime']))

listofnan = df.index[df['value1'].isnull()].tolist()

for i in listofnan:
    print(df.index.get_loc(i)) 

结果:

1
3

【讨论】:

以上是关于使用 DatetimeIndex 选择数据的数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 数据框中的 DateTimeIndex 中删除微秒?

如何在数据框中为 Pandas 日期时间对象正确设置 Datetimeindex?

基于时间间隔使用 DatetimeIndex 对 Pandas 数据帧进行切片

Pandas - 如何将 RangeIndex 转换为 DateTimeIndex

无法使用这些索引器对 DatetimeIndex 进行位置索引

datetimeindex 之前的天数(同时使用 .loc 和 .iloc)