如何无循环按指定时间窗口拆分含日期列的DataFrame?
按时间窗口快速拆分DataFrame(无循环实现)
你可以利用Pandas的向量化时间操作替代循环,大幅提升处理效率。以下两种方法都能满足需求:
方法一:直接通过小时范围筛选
利用dt.hour属性提取时间戳的小时部分,结合布尔索引直接筛选对应时间段的数据,这是最直观的实现方式:
import pandas as pd import numpy as np # 生成示例数据 df = pd.DataFrame(pd.date_range(start='2024-01-01', end='2024-01-10', freq='10min')) df['data'] = np.random.randint(100, size=len(df)) df.columns = ['date', 'data'] # 确保date列为datetime类型(若原始数据格式不匹配则执行) df['date'] = pd.to_datetime(df['date']) # 拆分三个时间窗口 df_morning = df[df['date'].dt.hour < 12] # 00:00-12:00 df_afternoon = df[(df['date'].dt.hour >= 12) & (df['date'].dt.hour < 18)] # 12:00-18:00 df_evening = df[df['date'].dt.hour >= 18] # 18:00-24:00
方法二:分箱分组(适合批量管理子数据)
如果需要统一管理所有子DataFrame,可以用pd.cut对小时进行分箱,再通过groupby一次性得到分组结果:
import pandas as pd import numpy as np # 生成示例数据 df = pd.DataFrame(pd.date_range(start='2024-01-01', end='2024-01-10', freq='10min')) df['data'] = np.random.randint(100, size=len(df)) df.columns = ['date', 'data'] df['date'] = pd.to_datetime(df['date']) # 定义时间区间分界点和对应标签 bins = [0, 12, 18, 24] labels = ['00:00-12:00', '12:00-18:00', '18:00-24:00'] # 新增时间窗口列(设置right=False使用左闭右开区间,匹配需求) df['time_window'] = pd.cut(df['date'].dt.hour, bins=bins, labels=labels, right=False) # 按窗口分组,得到字典格式的子DataFrame集合 window_dfs = dict(tuple(df.groupby('time_window'))) # 提取各时间段数据 df_morning = window_dfs['00:00-12:00'] df_afternoon = window_dfs['12:00-18:00'] df_evening = window_dfs['18:00-24:00']
性能优势说明
Pandas的向量化操作会将计算逻辑推送到底层C语言实现,避免了Python循环的逐元素遍历开销,数据量越大,性能提升越显著。
内容的提问来源于stack exchange,提问作者Avi T
相关产品推荐
相关产品推荐

