pandas:带有日期的基于标签位置的索引器(loc)的行为

时间:2016-02-02 17:49:15

标签: 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或其他东西,而不是看到的结果。

那么解释是什么?如何按日期选择多个(任意)行?

2 个答案:

答案 0 :(得分:3)

我不知道解释,也许目前的实现很难概括为列出索引。如果您使用实际时间戳而不是字符串,它将起作用:

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

答案 1 :(得分:1)

我认为您需要按http://www.w3schools.com/cssref/sel_enabled.asp将字符串转换为datetime并获取to_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