Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 选择单行作为带有DatetimeIndex的数据帧_Python_Pandas - Fatal编程技术网

Python 选择单行作为带有DatetimeIndex的数据帧

Python 选择单行作为带有DatetimeIndex的数据帧,python,pandas,Python,Pandas,我有一个数据帧中的时间序列,日期时间索引如下: 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)

我有一个数据帧中的时间序列,日期时间索引如下:

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
slize = pd.DataFrame(df.loc["2015-10-01 02:00:00",:])
Out[]:
        2015-10-01 02:00:00
values                    2
我希望尽可能简单地选择一行,根据日期作为键,如“2015-10-01 02:00:00”:

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

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,)
当然,我可以这样做以达到我的结果:

slize.T
Out[]:
                     values
2015-10-01 02:00:00       2
但是在这一点上,我也可以期望一个列作为一个系列,如果它是一个行系列还是一个列系列,那么自动添加T是有点难测试的。 我是否错过了选择我想要的东西的方法

df[df[time_series_row] == “data_to_match”]
很抱歉格式化了。在我的手机上,当我回到电脑前时会更新

编辑:

我通常会这样写:

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

您可以将字符串转换为日期时间-使用:

或将
系列
转换为
数据帧
并转置:

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

为了方便起见,我建议使用
pd.date\u range
生成索引,然后使用
.loc
时间戳
日期时间
对象

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)
In [2]: df.loc[[start]]
Out[2]:
            values
2015-10-01       0
然后可以将
.loc
时间戳
日期时间
对象一起使用

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)
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
是因为您试图通过查找名为
“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
索引,您应该使用前面提到的方法

这些令人惊讶的(?)导致相同的系列,如下所示:

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,)

如果您在一行上使用
.loc
,您将被迫输入您注意到的
系列。因此,您应该转换到
数据帧
,然后转置结果

loc在此时返回一个序列,这是一个已知且需要的行为。。为什么您想要一个数据帧?在我的代码中,我希望数据帧具有日期时间索引。它们应该可以包含一行或多行以及零列或多列。我想在大多数情况下,一行是一个系列是有意义的,但由于系列没有方向,我不知道如何将其转换为正确的格式。但我发现最意想不到的是,这导致了关键错误:df.loc[[“2015-10-01 02:00:00”],:]好的,我想我可以接受这个解决方案。好的,为了对我的例子进行更正,它必须是df[df.index==“2015-10-01 02:00:00”]在开始时使用了它,但现在它改为@MCMZL和jezrael指出的“精确索引”,因此接受了他们的问题。无论如何,谢谢你提醒我我错过了这个(明显的)方式。谢谢你详细的回答。我接受了这个,因为它是最详细的,并且包含了关于其他部分的@jezrael+内容的答案。我现在继续使用“精确索引”。谢谢非常有用。谢谢大家!
df.loc[“2015-10-01 02:00:00”]
行为让我很困惑。我想知道为什么你可以得到一个带有字符串的序列,但是不能得到带有df.loc[[“2015-10-01 02:00:00”]
的数据帧?