使用.loc(行和列)过滤具有日期时间索引的数据框

时间:2019-06-24 14:34:38

标签: python pandas

尝试使用.loc方法对数据帧的行和列进行切片,但无法对df的行进行切片(它具有日期时间索引)

我正在使用的数据框具有537行和10列。第一个日期是2018年1月1日,但我希望它对其进行切片,以便仅显示2019年的日期。

df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 536 entries, 2018-01-01 00:00:00 to 2019-06-20 00:00:00
Data columns (total 10 columns):
link_clicks               536 non-null int64
customer_count            536 non-null int64
transaction_count         536 non-null int64
customers_per_click       536 non-null float64
transactions_per_click    536 non-null float64
14_day_ma                 523 non-null float64
14_day_std                523 non-null float64
Upper14                   523 non-null float64
Lower14                   523 non-null float64
lower_flag                536 non-null bool
dtypes: bool(1), float64(6), int64(3)
memory usage: 42.4+ KB

df.loc['2019-01-01':'2019-06-01', ['customers_per_click', '14_day_ma', 'Upper14', 'Lower14']]

预期结果是返回该日期范围内的过滤数据帧。但是,当我执行该行代码时,会出现以下错误:

(显然这是索引的问题,但是我只是不确定正确的语法是什么,并且在网上查找解决方案时遇到了麻烦。)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_slice_bound(self, label, side, kind)
   4804             try:
-> 4805                 return self._searchsorted_monotonic(label, side)
   4806             except ValueError:

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in _searchsorted_monotonic(self, label, side)
   4764 
-> 4765         raise ValueError('index must be monotonic increasing or decreasing')
   4766 

ValueError: index must be monotonic increasing or decreasing

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-599-5bdb485482ff> in <module>
----> 1 merge2.loc['2019-11-01':'2019-02-01', ['customers_per_click', '14_day_ma', 'Upper14', 'Lower14']].plot(figsize=(15,5))

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexing.py in __getitem__(self, key)
   1492             except (KeyError, IndexError, AttributeError):
   1493                 pass
-> 1494             return self._getitem_tuple(key)
   1495         else:
   1496             # we by definition only have the 0th axis

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexing.py in _getitem_tuple(self, tup)
    886                 continue
    887 
--> 888             retval = getattr(retval, self.name)._getitem_axis(key, axis=i)
    889 
    890         return retval

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis)
   1865         if isinstance(key, slice):
   1866             self._validate_key(key, axis)
-> 1867             return self._get_slice_axis(key, axis=axis)
   1868         elif com.is_bool_indexer(key):
   1869             return self._getbool_axis(key, axis=axis)

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexing.py in _get_slice_axis(self, slice_obj, axis)
   1531         labels = obj._get_axis(axis)
   1532         indexer = labels.slice_indexer(slice_obj.start, slice_obj.stop,
-> 1533                                        slice_obj.step, kind=self.name)
   1534 
   1535         if isinstance(indexer, slice):

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in slice_indexer(self, start, end, step, kind)
   4671         """
   4672         start_slice, end_slice = self.slice_locs(start, end, step=step,
-> 4673                                                  kind=kind)
   4674 
   4675         # return a slice

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in slice_locs(self, start, end, step, kind)
   4870         start_slice = None
   4871         if start is not None:
-> 4872             start_slice = self.get_slice_bound(start, 'left', kind)
   4873         if start_slice is None:
   4874             start_slice = 0

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_slice_bound(self, label, side, kind)
   4806             except ValueError:
   4807                 # raise the original KeyError
-> 4808                 raise err
   4809 
   4810         if isinstance(slc, np.ndarray):

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_slice_bound(self, label, side, kind)
   4800         # we need to look up the label
   4801         try:
-> 4802             slc = self._get_loc_only_exact_matches(label)
   4803         except KeyError as err:
   4804             try:

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in _get_loc_only_exact_matches(self, key)
   4770         get_slice_bound.
   4771         """
-> 4772         return self.get_loc(key)
   4773 
   4774     def get_slice_bound(self, label, side, kind):

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2657                 return self._engine.get_loc(key)
   2658             except KeyError:
-> 2659                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2660         indexer = self.get_indexer([key], method=method, tolerance=tolerance)
   2661         if indexer.ndim > 1 or indexer.size > 1:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: '2019-11-01'

2 个答案:

答案 0 :(得分:1)

如果索引的类型为“ datetime”,请尝试:

from datetime import datetime
df.loc[(df.index>=datetime(2019,1,1)) & (df.index<= datetime(2019,6,1)), ['customers_per_click', '14_day_ma', 'Upper14', 'Lower14']]

答案 1 :(得分:0)

在没有所有细节的情况下,我提出了以下代码:

index = pd.date_range('1/1/2018', periods=1100)
ts = pd.Series(np.random.normal(0.5, 2, 1100), index)
grouped = ts.groupby(lambda x: x.year)
grouped.size()
2018    365
2019    365
2020    366
2021      4
dtype: int64

您可以使用以下方式选择年份(一组):

grouped.get_group(2019)
len(grouped.get_group(2019))
365

您需要更具体的内容吗?