Pandas:带日期的标签定位索引器(loc)的行为

2024-10-01 07:16:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我几天前才开始使用pandas,我也不是Python的习惯用户。我发现下面所示示例中loc的以下行为令人困惑:

import pandas as pd
dates = pd.date_range('2015-01-01', '2015-01-07')
df = pd.DataFrame({'Sunnyland':[34, 36, 32, 37, 34, 36, 38], 'Freezeville':[4, 5, 6, 5, 5, 3, 2]}, index=dates)

创建日期框:

[请原谅列名的格式问题,它们应该与表列对齐]:

Freezeville   Sunnyland
2015-01-01    4   34
2015-01-02    5   36
2015-01-03    6   32
2015-01-04    5   37
2015-01-05    5   34
2015-01-06    3   36
2015-01-07    2   38

现在让我们使用loc来选择行:

df.loc['2015-01-02'] # select single row

这就像预期的那样工作,输出一个Series对象:

Freezeville     5
Sunnyland      36
Name: 2015-01-02 00:00:00, dtype: int64

下面的工作也很好

df.loc['2015-01-02':'2015-01-06'] # select range of rows:

输出:

Freezeville   Sunnyland
2015-01-02    5   36
2015-01-03    6   32
2015-01-04    5   37
2015-01-05    5   34
2015-01-06    3   36

问题在于以下语句:

df.loc[['2015-01-02', '2015-01-06']] # comma-separated list of rows

产生

  Freezeville     Sunnyland
2015-01-02    NaN     NaN
2015-01-06    NaN     NaN

我本以为这里发生了某种类型的推理问题——但在这种情况下,我期望的是KeyError或什么,而不是看到的结果。你知道吗

那么解释是什么,我怎样才能按日期选择多个(任意)行呢?你知道吗


Tags: of用户示例pandasdfrangenanselect
2条回答

我不知道怎么解释,也许目前的实现很难推广到列表索引。如果使用实际的时间戳而不是字符串,它将起作用:

In [31]: df.loc[pd.DatetimeIndex(['2015-01-02', '2015-01-06'])]
Out[31]: 
            Freezeville  Sunnyland
2015-01-02            5         36
2015-01-06            3         36

我认为您需要通过^{}将字符串转换为datetime,然后得到^{},因为您需要匹配索引:

print pd.to_datetime('2015-01-02')
2015-01-02 00:00:00

print pd.to_datetime('2015-01-02').date()
2015-01-02

print df.loc[[pd.to_datetime('2015-01-02').date(), pd.to_datetime('2015-01-06').date()]] 
            Freezeville  Sunnyland
2015-01-02            5         36
2015-01-06            3         36

相关问题 更多 >