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

ML.NET使用TypeConvertingTransformer将long转DateTime报错,能否实现?

问题解答

不能直接通过TypeConvertingTransformer(即ConvertType转换方法)将Int64类型的时间戳转换为DateTime类型。ML.NET的ConvertType仅支持有限的类型转换组合,Int64到DateTime不在官方支持的转换列表中,这就是你遇到ArgumentOutOfRangeException的原因。

解决方案:使用自定义映射转换

既然你的时间戳是秒级Unix时间戳,可以通过CustomMapping创建自定义转换逻辑,手动将long类型的Unix时间戳转换为DateTime类型。

修改后的代码示例:

using Microsoft.ML;
using Microsoft.ML.Data;

MLContext context = new(seed: 1);

var rawData = new InputData[] {
    new() { Timestamp = 1590085800 },
    new() { Timestamp = 1590089400 },
    new() { Timestamp = 1590154200 },
    new() { Timestamp = 1590157800 },
    new() { Timestamp = 1590161400 },
    new() { Timestamp = 1674228600 },
    new() { Timestamp = 1674232200 },
    new() { Timestamp = 1674235800 },
    new() { Timestamp = 1674239400 },
    new() { Timestamp = 1674243000 },
};

var data = context.Data.LoadFromEnumerable(rawData);

// 使用CustomMapping实现自定义转换逻辑
var pipeline = context.Transforms.CustomMapping(
    (InputData input, TransformedData output) =>
    {
        // 将秒级Unix时间戳转换为DateTime
        output.DateTime = DateTimeOffset.FromUnixTimeSeconds(input.Timestamp).DateTime;
    },
    contractName: "TimestampToDateTimeMapping");

var transformer = pipeline.Fit(data);

// 验证转换结果
var transformedData = context.Data.CreateEnumerable<TransformedData>(transformer.Transform(data), reuseRowObject: false);
foreach (var item in transformedData)
{
    Console.WriteLine($"Timestamp: {item.Timestamp} -> DateTime: {item.DateTime}");
}

class InputData
{
    public long Timestamp { get; set; }
}

class TransformedData : InputData
{
    public DateTime DateTime { get; set; }
}

补充说明

如果你的时间戳是毫秒级Unix时间戳,只需将转换逻辑替换为DateTimeOffset.FromUnixTimeMilliseconds(input.Timestamp).DateTime即可。

内容的提问来源于stack exchange,提问作者Arkadii Kuznetsov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:40:55