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

在SAS中利用查找表按夏令时区间拆分数据集的方法咨询

按夏令时区间拆分数据集实现方案

SQL 实现(大数据量场景最高效)

核心逻辑是通过非等值左关联给主表数据直接打夏令时标记,一次查询即可完成标记,后续过滤就能拆分两组数据,避免重复扫表。

-- 通用逻辑示例(MySQL版本)
SELECT 
    t1.SHORT_DATE,
    t1.HOUR,
    t1.VALUE,
    CASE WHEN t2.DST_BEG IS NOT NULL THEN 1 ELSE 0 END AS is_dst
FROM INITIAL_SYSTEM_LOAD t1
LEFT JOIN DST_HOUR_SHIFT t2
    ON STR_TO_DATE(t1.SHORT_DATE, '%m/%d/%Y') BETWEEN STR_TO_DATE(t2.DST_BEG, '%m/%d/%Y') AND STR_TO_DATE(t2.DST_END, '%m/%d/%Y')
  • 不同数据库日期转换函数替换:Oracle替换STR_TO_DATE为TO_DATE,SQL Server使用CONVERT(DATE, 字段, 101)即可
  • 性能优化建议:提前将两个表的日期字段存储为日期类型,或给转换后的日期加函数索引,关联效率可提升数倍
  • 拆分方式:查询结果加WHERE is_dst = 1过滤得到夏令时数据,加WHERE is_dst = 0得到非夏令时数据

Python Pandas 实现(本地处理中小数据集)

不需要做表关联,用区间匹配即可快速完成标记拆分:

import pandas as pd

# 读取数据并转换日期格式
dst_df = pd.read_csv("DST_HOUR_SHIFT.csv")
dst_df[["DST_BEG", "DST_END"]] = dst_df[["DST_BEG", "DST_END"]].apply(pd.to_datetime, format="%m/%d/%Y")

load_df = pd.read_csv("INITIAL_SYSTEM_LOAD.csv")
load_df["SHORT_DATE"] = pd.to_datetime(load_df["SHORT_DATE"], format="%m/%d/%Y")

# 构建夏令时区间索引
dst_intervals = pd.arrays.IntervalIndex.from_arrays(dst_df["DST_BEG"], dst_df["DST_END"], closed="both")
# 打夏令时标记
load_df["is_dst"] = load_df["SHORT_DATE"].apply(lambda x: x in dst_intervals).astype(int)

# 直接拆分两组数据
dst_data = load_df[load_df["is_dst"] == 1]
non_dst_data = load_df[load_df["is_dst"] == 0]
  • 万级以下数据处理速度极快,百万级以上数据可改用pandas的非等值merge配合query过滤,性能更高

内容的提问来源于stack exchange,提问作者C McCown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 03:36:03