我有一个从CSV文件创建的Pandas数据帧。由于各种原因,我转换了购买日期'从string到datetime.date对象的列并删除时间 - 如下所示:
shoppingData_df[dateCol] = pd.to_datetime(shoppingData_df[dateCol])
# drop time from datetime col.
shoppingData_df[dateCol] = shoppingData_df[dateCol].apply(lambda x: x.date())
现在,我想对shoppingData_df进行一些过滤操作 - 基于开始和结束日期。我可以控制start_date和end_date的格式(可以是字符串或日期时间obj)。我想知道如何过滤其中包含datetime列的数据帧。我知道我可以在数据框中包含字符串日期列时对其进行过滤:
start_date_str = '2016-03-22'
end_date_str = '2016-03-30'
print ("\n\n Using dataframes with string objects.")
mask = (df['purchase_date'] > start_date_str) & (df['purchase_date'] < end_date_str)
dfs = df[mask]
print dfs
注意:我的数据集非常庞大(数百万行)。我不想复制或将purchase_date列转换回字符串......这样只是用于子集化。这可能需要很长时间。我也不想做出“购买日期”。列作为索引(然后执行df [start_date:end_date])。
问题:有没有办法使用datetime对象列对数据框进行子集化/过滤?类似的东西:
import datetime as dt
print ("\n\n Using dataframes with datetime objects.")
start_date_str = '2016-03-22'
end_date_str = '2016-03-30'
start_date_obj = dt.datetime.strptime(start_date_str, '%Y-%m-%d')
end_date_obj = dt.datetime.strptime(end_date_str, '%Y-%m-%d')
mask = (df['purchase_date'] > start_date_obj) & (df['purchase_date'] < end_date_obj)
dfs = df[mask]
print dfs
当我运行上面的代码片段时,我没有收到错误,而是一个空的df。我打印出列的类型和条件变量的类型(start_date)。
print type(df['purchase_date'] -- <class 'pandas.core.series.Series'>
print type(start_date_obj) -- <type 'datetime.date'>
print type(end_date_obj) -- <type 'datetime.date'>
Empty DataFrame
Columns: [purchase_date, total_purchase, num_customers, cust_id]
Index: []
AusMBP:~/av/exps/py$
我期望得到的子集df中有一些值。我不确定将系列与datetime.date对象进行比较会导致问题。