You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无循环按指定时间窗口拆分含日期列的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:52:41