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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:57:23