[英]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.