簡體   English   中英

如何使用字符串訪問pandas DataFrame datetime索引

[英]How to access pandas DataFrame datetime index using strings

這是一個非常簡單實用的問題。 我覺得它必須是一個愚蠢的細節,應該有類似的問題。 我無法找到他們。 如果有人,我會高興地刪除這個。

我發現的最接近的是: pandas:用loc迭代DataFrame索引

如何僅在索引為日期和時間時基於時間選擇pandas數據幀中的行

無論如何,事情是,我有一個datetime索引的熊貓數據幀如下:

In[81]: y
Out[81]: 
            PETR4  CSNA3  VALE5
2008-01-01    0.0    0.0    0.0
2008-01-02    1.0    1.0    1.0
2008-01-03    7.0    7.0    7.0

In[82]: y.index
Out[82]: DatetimeIndex(['2008-01-01', '2008-01-02', '2008-01-03'], dtype='datetime64[ns]', freq=None)

奇怪的是,我無法使用以下方法之一訪問其值:

In[83]: y[datetime.datetime(2008,1,1)]
In[84]: y['2008-1-1']
In[85]: y['1/1/2008']

我收到了KeyError錯誤。

更奇怪的是,以下方法可行:

In[86]: y['2008']
Out[86]: 
            PETR4  CSNA3  VALE5
2008-01-01    0.0    0.0    0.0
2008-01-02    1.0    1.0    1.0
2008-01-03    7.0    7.0    7.0
In[87]: y['2008-1']
Out[87]: 
            PETR4  CSNA3  VALE5
2008-01-01    0.0    0.0    0.0
2008-01-02    1.0    1.0    1.0
2008-01-03    7.0    7.0    7.0

我對熊貓很新,所以也許我在這里錯過了一些東西?

熊貓正在接受[]並決定它應該做什么。 如果它是列名的子集,它將返回包含這些列的DataFrame。 如果它是一系列索引值,它將返回這些行的子集。 什么是不處理是采取單個索引值。

兩個解決方案

1.將參數轉換為pandas解釋為范圍的東西。

df['2008-01-01':'2008-01-01']

2.使用旨在為您提供此結果的方法。 loc[]

df.loc['2008-01-01']

鏈接到文檔

您可以在索引上使用to_pydatetime函數,因此:

y[y.index.to_pydatetime() == datetime.datetime(2008,1,1)]

撤消數據框允許索引工作:

這是你的.csv數據文件:

Date,PETR4,CSNA3,VALE5
2008-01-01,0.0,0.0,0.0
2008-01-02,1.0,1.0,1.0
2008-01-03,7.0,7.0,7.0

使用以下咒語將其讀入DataFrame:

>>> a = pd.read_csv('your.csv', index_col=0, parse_dates=True, infer_datetime_format=True)

然后,嘗試索引一行:

>>> a['2008-01-01']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 1969, in __getitem__
    return self._getitem_column(key)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 1976, in _getitem_column
    return self._get_item_cache(key)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 1091, in _get_item_cache
    values = self._data.get(item)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/internals.py", line 3211, in get
    loc = self.items.get_loc(item)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/index.py", line 1759, in get_loc
    return self._engine.get_loc(key)
  File "pandas/index.pyx", line 137, in pandas.index.IndexEngine.get_loc (pandas/index.c:3979)
  File "pandas/index.pyx", line 157, in pandas.index.IndexEngine.get_loc (pandas/index.c:3843)
  File "pandas/hashtable.pyx", line 668, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12265)
  File "pandas/hashtable.pyx", line 676, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12216)
KeyError: '2008-01-01'

您最終得到了KeyError的回溯

但是,如果你顛倒它,像這樣:

>>> b = a[::-1]

然后嘗試相同的索引,你得到了正確的結果:

>>> b['2008-01-01']
            PETR4  CSNA3  VALE5
Date                           
2008-01-01      0      0      0

知道為什么會這樣。 機會是,它與單向時間序列有關,但與另一種無關? 知識淵博的人應該回答這個問題。

更新:通過RTFM,我發現了這個頁面:

https://pandas.pydata.org/pandas-docs/stable/timeseries.html

如果您找到標題為“切片與完全匹配”的部分,則會出現一條警告,說明此行為。 問題似乎是對於TimeSeries,完全匹配被解釋為列名。 對於未排序的數據幀,這不會發生。 請參閱上面引用的部分中的警告框。 我仍然覺得這非常令人困惑,但你去了......

編輯:更改了b的打印輸出,原來是錯誤的。

Edit1:更新python文檔中的說明。

暫無
暫無

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

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