我在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,那么它很难测试。 我错过了一种选择我想要的方式吗?
答案 0 :(得分:2)
为方便起见,我建议您使用pd.date_range
生成索引,然后将.loc
与Timestamp
或datetime
对象一起使用。
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)
然后,您可以将.loc
与Timestamp
或datetime
对象一起使用。
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