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

