使用Pandas从事件日志DataFrame中过滤剔除周末数据的问题求助
问题根因
- 最后一行的过滤逻辑仅生成了临时的过滤结果,没有赋值给变量保存,所以你看不到修改后的效果
- 时间类型存在隐性不匹配问题:你生成
list_excluded时用的是pandas Timestamp类型迭代,和timestamp_date列的python原生date类型可能出现匹配失效的情况
修复后的可运行代码
from datetime import timedelta, date import pandas as pd # 数据加载 df= pd.read_csv("running-example.csv", delimiter=";") df["timestamp"] = pd.to_datetime(df["timestamp"]) df["timestamp_date"] = df["timestamp"].dt.date def daterange(date1, date2): # 先统一转成python date类型避免类型冲突 date1 = date1.date() date2 = date2.date() for n in range(int ((date2 - date1).days)+1): yield date1 + timedelta(n) # 取起止日期 start_dt = df["timestamp"].min() end_dt = df["timestamp"].max() print("Start_dt: {} & end_dt: {}".format(start_dt, end_dt)) # 6对应周六、7对应周日 weekends = [6,7] # 生成要排除的周末日期列表 list_excluded = [dt for dt in daterange(start_dt, end_dt) if dt.isoweekday() in weekends] # 过滤后赋值给新的df df_filtered = df[~df["timestamp_date"].isin(list_excluded)]
更简化的实现方案
无需单独生成排除列表,直接通过pandas内置的星期属性一步完成过滤,性能更高逻辑更简洁:
import pandas as pd df= pd.read_csv("running-example.csv", delimiter=";") df["timestamp"] = pd.to_datetime(df["timestamp"]) # 直接过滤:isoweekday返回1-5对应周一到周五,直接保留即可 df_filtered = df[df["timestamp"].dt.isoweekday().between(1,5)]
内容的提问来源于stack exchange,提问作者sebikooo
相关产品推荐
相关产品推荐

