如何在sklearn2pmml的PMML管道中提取日期对应的星期几
在适配sklearn2pmml的管道中实现日期转星期名称的可行方案
PMML标准本身内置了完整的日期处理能力,不需要依赖pd.to_datetime()这类Python侧专属逻辑,以下是两种可直接落地、导出的PMML可跨环境运行的方案:
方案1:直接调用PMML内置日期函数(优先选,零额外依赖)
PMML 4.4及以上版本原生支持日期分量格式化,sklearn2pmml提供的ExpressionTransformer可以直接映射这类原生函数,导出的PMML可以在JPMML、Spark MLlib等所有兼容PMML的推理引擎直接运行,不需要绑定Python环境。
- 核心逻辑:用PMML内置的
dateToString函数搭配日期格式符,直接从日期类型字段提取星期名称 - 格式符规则遵循Java SimpleDateFormat规范:
EEEE返回完整星期名称(如Monday、星期一,随本地化配置变化),EEE返回星期缩写(如Mon、周一) - 可直接运行的代码示例:
from sklearn2pmml import PMMLPipeline from sklearn2pmml.preprocessing import ExpressionTransformer from sklearn2pmml import sklearn2pmml import pandas as pd # 定义星期提取逻辑:如果你的原始字段是字符串日期,替换成parseDate先转日期即可 # 例:字符串日期格式为yyyy-MM-dd的话,表达式写为 dateToString("%EEEE", parseDate($raw_date_col, "yyyy-MM-dd")) weekday_extractor = ExpressionTransformer( expression = 'dateToString("%EEEE", $your_datetime_column)' ) # 组装PMML管道 pipeline = PMMLPipeline(steps=[ ("extract_weekday_name", weekday_extractor), # 后续接特征编码、模型训练步骤即可 ]) # 拟合时仅需保证输入的对应日期列是datetime类型,导出的PMML会内置完整转换逻辑 # sklearn2pmml(pipeline, "datetime_process_pipeline.pmml")
如果需要固定输出中文星期名称,直接给dateToString传地区参数即可,表达式改为dateToString("%EEEE", $your_datetime_column, "zh_CN")。
方案2:自定义转换器(适配自定义星期映射规则)
如果需要定制星期输出规则(比如自定义中英文映射、特殊星期分组逻辑),可以写符合sklearn规范的自定义转换器,用sklearn2pmml提供的装饰器注册逻辑,避免导出时被序列化为Python依赖的黑盒:
import pandas as pd from sklearn.base import BaseEstimator, TransformerMixin from sklearn2pmml.util import datetime_func # 装饰器会自动把Python侧的日期处理逻辑映射为PMML原生操作 @datetime_func def _get_weekday(x): return x.dt.day_name() class CustomWeekdayExtractor(BaseEstimator, TransformerMixin): def fit(self, X, y=None): return self def transform(self, X): # X为输入的单列日期DataFrame weekday_series = _get_weekday(X.iloc[:, 0]) return pd.DataFrame({"weekday_name": weekday_series})
避坑提示
- 不要直接在管道中裸写
pd.to_datetime()、df.dt.day_name()这类pandas原生逻辑:sklearn2pmml无法识别这类未封装的操作,要么导出时报序列化错误,要么导出的PMML只能在Python环境运行 - 不要混用Python和PMML的日期格式符:Python里取完整星期名用
%A,PMML里对应的是%EEEE,写错会返回空值或者格式错误 - 时间戳类型先做类型转换:如果原始日期是整型时间戳,先转成PMML datetime类型再做提取,不要直接对时间戳数字做格式化
内容的提问来源于stack exchange,提问作者Bob Rupak Roy
相关产品推荐
相关产品推荐

