簡體   English   中英

pandas DataFrame從DateTimeIndex - KeyError中選擇行列表。 了解原因

[英]pandas DataFrame selecting list of rows from DateTimeIndex - KeyError. Understanding why

我想知道為什么我會收到這個錯誤。 我已經有了解決這個問題的方法,它實際上已經解決 ,只需要理解為什么它不能像我期望的那樣工作。

我想了解為什么會引發KeyError:

dates = pd.date_range('20130101', periods=4)
df = pd.DataFrame(np.identity(4), index=dates, columns=list('ABCD'))
df.loc[['20130102', '20130103'],:]

以下反饋:

KeyError: "None of [['20130102', '20130103']] are in the [index]"

正如解釋在這里 ,解決方案就是要做到:

df.loc[pd.to_datetime(['20130102','20130104']),:]

所以問題肯定在於loc將字符串列表作為從DateTimeIndex中選擇的參數。 但是,我可以看到以下調用對於此函數是可以的:

df.loc['20130102':'20130104',:]

df.loc['20130102']

我想了解它是如何工作的,並希望我可以使用任何資源來預測此函數的行為,具體取決於它的調用方式。 我從pandas文檔中讀取了索引和選擇數據時間序列/日期功能 ,但無法找到解釋。

通常,當您將類似對象的數組傳遞給loc ,Pandas將嘗試在索引中找到該數組的每個元素。 如果找不到,你會得到一個KeyError 和! 當索引中的值是Timestamp s時,你傳遞了一個字符串數組...所以這些字符串肯定不在索引中。

然而,熊貓也試圖讓事情變得更容易。 特別是,使用DatetimeIndex ,如果要傳遞字符串標量

df.loc['20130102']

A    0.0
B    1.0
C    0.0
D    0.0
Name: 2013-01-02 00:00:00, dtype: float64

Pandas將嘗試將該標量解析為Timestamp並查看該值是否在索引中。

如果你要傳遞slice對象

df.loc['20130102':'20130104']

              A    B    C    D
2013-01-02  0.0  1.0  0.0  0.0
2013-01-03  0.0  0.0  1.0  0.0
2013-01-04  0.0  0.0  0.0  1.0

Pandas還將嘗試將切片對象的位解析為Timestamp並返回適當切片的數據幀。

您的KeyError只是通過了Pandas Devs有時間編寫代碼的有用程度的限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM