2017-10-09 55 views
2

說我有一個DF如下:熊貓:調用df.loc []選自pd.datetime的索引

a=pd.DataFrame([[1,3]]*3,columns=['a','b'],index=['5/4/2017','5/6/2017','5/8/2017'])  
a.index=pd.to_datetime(a.index,format='%m/%d/%Y') 

類型的df.index的現在是

<class 'pandas.core.indexes.datetimes.DatetimeIndex'> 

當我們嘗試根據類型pd.datetime的索引調用一行數據時,可以根據日期的字符串格式調用該值,而不是輸入日期時間對象。在上述情況下,如果我想呼籲2017年5月4日的數據行,我可以簡單地輸入的日期字符串格式的.loc如下:

print(a.loc['5/4/2017']) 

而且我們也不需要輸入DateTime對象

print(a.loc[pd.datetime(2017,5,4)] 

我的問題是,要求根據日期的字符串格式從.loc僞數據時,如何大熊貓知道我的日期字符串格式如下MDY或DMY或其他組合?在這種情況下,我使用了a.loc ['5/4/2017']併成功返回值。爲什麼它不認爲這可能意味着4月5日這不在這個指數內?

回答

1

這是我最好的拍攝:

熊貓有一個名爲pandas._guess_datetime_format的內部函數。這是將'infer_datetime_format'參數傳遞給pandas.to_datetime時所調用的內容。它接受一個字符串並貫穿「猜測」格式列表,並返回關於如何將該字符串轉換爲日期時間對象的最佳猜測。

引用帶有字符串的日期時間索引可能會使用類似的方法。

我做了一些測試,看看在你描述的情況下會發生什麼 - 數據幀包含日期2017-04-05和2017-05-04。

在這種情況下,執行以下操作:

df.loc['5/4/2017'] 

返回的數據爲2017年5月4日

df.loc['4/5/2017'] 

發回4月5日的數據,2017年

試圖引用4/5/2017在您的原始矩陣中給出了「不在[index]」錯誤。

基於此,我的結論是pandas._guess_datetime_format在無法區別於「%d /%m /%Y」的情況下默認爲「%m /%d /%Y」格式。這是美國的標準日期格式。

+0

謝謝你的深思熟慮的答案。我懷疑如果使用的字符串格式取決於Windows/OS的語言/日期設置? – user7786493

+1

來自[IO工具文檔](http://pandas.pydata.org/pandas-docs/version/0.20/io.html): 雖然美國的日期格式通常是MM/DD/YYYY,但許多國際格式使用改爲DD/MM/YYYY。爲了方便起見,提供了dayfirst關鍵字。 'dayfirst'關鍵字可用於在解析.csv文件時正確讀取國際日期,但我不確定您是否可以從'.loc'設置'dayfirst'。找到答案的最佳方法可能是在源代碼中尋找答案,但可能會出現這樣的情況:.loc只能始終以'dayfirst = False'運行。 –