首页 > 解决方案 > 按数据时间列关闭的 DataFrame 过滤

问题描述

我已经设置了两个数据框,并尝试通过将日期时间对象列移动到索引来过滤结果,并使用 .last('7D') 提取过去 7 天内日期时间被“标记”的条目。它适用于第一个数据帧,但不适用于第二个。我尝试了各种变体来过滤 df 以获得我需要的东西,但无法获得准确的输出。我不知所措!这也是迭代构建的,所以如果你看到一些重构机会,请告诉我。

原始数据框: engagements

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 2572 entries, 0 to 2571 
Data columns (total 15 columns):
REQ_NAME                2572 non-null object
REQ_ID                  2572 non-null object
STATUS                  2572 non-null object
full_name               2572 non-null object
BIZ_UNIT                2572 non-null object
COMPLEXITY              2378 non-null object
PRIORITY                2390 non-null object
OPEN_DATE               2572 non-null datetime64[ns]
REQ_DATE                2572 non-null object
REQ_CAT                 2572 non-null object
REQ_NOTE                2572 non-null object
CostCenter              2572 non-null int64 
TargetCompletionDate    2572 non-null object 
UpdateDTTM              2514 non-null datetime64[ns] 
age                     2572 non-null timedelta64[ns] 
dtypes: datetime64[ns](2), int64(1), object(11), timedelta64[ns](1) 
memory usage: 301.5+ KB 

分离数据框

active_engagements = engagements[engagements['STATUS'].isin(active_status)]
comp_engagements = engagements[engagements['STATUS'].isin(comp_status)]

第一个过滤器

act_eng_open_lw = active engagements.set_index('OPEN_DATE')
act_eng_open_lw = act_eng_open_lw.last('7D')

输出是我希望看到的 10 行数据

问题子数据框

act_eng_comp_lw = comp_engagements.set_index('UpdateDTTM')
act_eng_comp_lw = act_eng_comp_lw.last('7D')

输出为 105 行,我预计为 32

两个过滤的 DF 上的信息调用: act_eng_open_lw:

<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 10 entries, 2019-12-20 to 2019-12-26
Data columns (total 14 columns): 
REQ_NAME                10 non-null object 
REQ_ID                  10 non-null object 
STATUS                  10 non-null object 
full_name               10 non-null object 
BIZ_UNIT                10 non-null object 
COMPLEXITY              5 non-null object 
PRIORITY                5 non-null object 
REQ_DATE                10 non-null object 
REQ_CAT                 10 non-null object 
REQ_NOTE                10 non-null object 
CostCenter              10 non-null int64 
TargetCompletionDate    10 non-null object 
UpdateDTTM              5 non-null datetime64[ns] 
age                     10 non-null timedelta64[ns] 
dtypes: datetime64[ns](1), int64(1), object(11), timedelta64[ns](1) 
memory usage: 1.2+ KB  

act_eng_comp_lw

<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 105 entries, 2019-12-26 to 2019-11-27
Data columns (total 14 columns): 
REQ_NAME                105 non-null object 
REQ_ID                  105 non-null object 
STATUS                  105 non-null object 
full_name               105 non-null object 
BIZ_UNIT                105 non-null object 
COMPLEXITY              102 non-null object 
PRIORITY                104 non-null object 
OPEN_DATE               105 non-null datetime64[ns] 
REQ_DATE                105 non-null object 
REQ_CAT                 105 non-null object 
REQ_NOTE                105 non-null object 
CostCenter              105 non-null int64 
TargetCompletionDate    105 non-null object 
age                     105 non-null int64 
dtypes: datetime64[ns](1), int64(2), object(11) 
memory usage: 12.3+ KB 

问题:使用相同的过滤器,为什么一个 Datetime 列可以正确过滤.last而另一个不能正确过滤?

标签: pythonpandasdataframe

解决方案


我最终改变了我用来捕捉过去 7 天的方法,而不是.last

act_eng_open_lw = act_eng_open_lw[act_eng_open_lw.index > dt.datetime.now() - pd.to_timedelta("7day")]

此方法有效地适用于我的两个数据框。


推荐阅读