使用DatetimeIndex选择单行作为数据帧

时间:2018-01-03 11:16:09

标签: python pandas

我在DatetimeIndex的数据框中有一个时间序列:

import pandas as pd
dates= ["2015-10-01 00:00:00",
         "2015-10-01 01:00:00",
         "2015-10-01 02:00:00",
         "2015-10-01 03:00:00",
         "2015-10-01 04:00:00"]
df = pd.DataFrame(index=pd.DatetimeIndex(dates))
df["values"] = range(0,5)

Out[]:
                     values
2015-10-01 00:00:00       0
2015-10-01 01:00:00       1
2015-10-01 02:00:00       2
2015-10-01 03:00:00       3
2015-10-01 04:00:00       4

我想尽可能简单干净地选择一个看起来像这样的行,基于日期是关键,例如" 2015-10-01 02:00:00":

Out[]:
                     values
2015-10-01 02:00:00       2

仅使用索引会导致关键错误:

df["2015-10-01 02:00:00"]
Out[]:
KeyError: '2015-10-01 02:00:00'

同样如此:

df.loc[["2015-10-01 02:00:00"]]
Out[]:
KeyError: "None of [['2015-10-01 02:00:00']] are in the [index]"

令人惊讶的是(?)产生如下相同的系列:

df.loc["2015-10-01 02:00:00"]
Out[]:
values    2
Name: 2015-10-01 02:00:00, dtype: int32

df.loc["2015-10-01 02:00:00",:]
Out[]:

values    2
Name: 2015-10-01 02:00:00, dtype: int32

print(type(df.loc["2015-10-01 02:00:00"]))
print(type(df.loc["2015-10-01 02:00:00",:]))
print(df.loc["2015-10-01 02:00:00"].shape)
print(df.loc["2015-10-01 02:00:00",:].shape)
Out[]:
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
(1,)
(1,)

我可以像这样包装DataFrame中的任何一个:

slize = pd.DataFrame(df.loc["2015-10-01 02:00:00",:])
Out[]:
        2015-10-01 02:00:00
values                    2

当然,我可以这样做来达到我的结果:

slize.T
Out[]:
                     values
2015-10-01 02:00:00       2

但是在这一点上,我还可以期待一个列作为一个系列,如果它是一个行或列系列来自动添加T,那么它很难测试。 我错过了一种选择我想要的方式吗?

3 个答案:

答案 0 :(得分:2)

为方便起见,我建议您使用pd.date_range生成索引,然后将.locTimestampdatetime对象一起使用。

from datetime import datetime

import pandas as pd

start = datetime(2015, 10, 1, 0, 0, 0)
end = datetime(2015, 10, 1, 4, 0, 0)
dates = pd.date_range(start, end, freq='H')
df = pd.DataFrame(index=pd.DatetimeIndex(dates))
df["values"] = range(0,5)

然后,您可以将.locTimestampdatetime对象一起使用。

In [2]: df.loc[[start]]
Out[2]:
            values
2015-10-01       0

更多细节

  

仅使用索引会导致关键错误:

df["2015-10-01 02:00:00"]
Out[]:
KeyError: '2015-10-01 02:00:00'
发生

KeyError是因为您尝试通过查找名为DataFrame

的列来返回"2015-10-01 02:00:00"的视图
  

同样如此:

df.loc[["2015-10-01 02:00:00"]]
Out[]:
KeyError: "None of [['2015-10-01 02:00:00']] are in the [index]"

您的第二个选项无法使用str索引,您应该使用上面提到的exact indexing

  

令人惊讶的是(?)产生如下相同的系列:

df.loc["2015-10-01 02:00:00"]
Out[]:
values    2
Name: 2015-10-01 02:00:00, dtype: int32

如果您在一行中使用.loc,您会注意到Series类型的强制。因此,您应该转换为DataFrame,然后转置结果。

答案 1 :(得分:1)

df[df[time_series_row] == “data_to_match”]

抱歉格式化。在我的手机上,当我回到电脑时会更新。

编辑:

我通常会这样写:

bitmask = df[time_seried_row] == "data_to_match"
row = df[bitmask]

答案 2 :(得分:1)

您可以使用exact indexing

将字符串转换为日期时间
print (df.loc[[pd.to_datetime("2015-10-01 02:00:00")]])
                     values
2015-10-01 02:00:00       2

或将Series转换为DataFrame并转置:

print (df.loc["2015-10-01 02:00:00"].to_frame().T)
                     values
2015-10-01 02:00:00       2