在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
相关产品推荐
相关产品推荐

