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

CSV自定义数字格式时间戳转h:mm:ss AM/PM格式问题

解决CSV中mm:ss.0格式时间转h:mm:ss AM/PM的问题

你之前的代码无法成功转换,核心问题有两个:

  • 第一个脚本错误引用了不存在的$_.Date属性,应该对应CSV中的timestamp列
  • 第二个脚本直接将非标准的mm:ss.0格式字符串强制转为[datetime]会失败,因为PowerShell默认不识别这种仅包含分、秒、毫秒的时间格式

解决方案:手动解析时间分量再转换

需要先拆分mm:ss.0格式的字符串,提取分钟、秒、毫秒,构建时间间隔后再映射到当天的起始时间,最终转换为目标格式:

Import-Csv foo.csv | 
    Select-Object *, @{
        Name = 'timestamp'
        Expression = {
            # 拆分输入的时间字符串(格式为"mm:ss.0")
            $parts = $_.timestamp -split '[:.]'
            $minutes = [int]$parts[0]
            $seconds = [int]$parts[1]
            $milliseconds = [int]$parts[2] * 100 # 输入的.5实际代表500毫秒

            # 构建时间间隔,叠加到当天0点时间上
            $timeSpan = [TimeSpan]::FromMinutes($minutes) + [TimeSpan]::FromSeconds($seconds) + [TimeSpan]::FromMilliseconds($milliseconds)
            $baseDateTime = [datetime]::Today
            ($baseDateTime + $timeSpan).ToString('h:mm:ss tt')
        }
    } -ExcludeProperty timestamp | 
    Export-Csv -NoTypeInformation foo2.csv

这个脚本会将示例中的42:00.5解析为42分钟、0秒、500毫秒,对应时间间隔00:42:00.500,叠加到当天0点后转换为12:42:00 AM,完全匹配你的需求。

特殊情况:如果CSV存储的是Excel时间数字

如果你的CSV中timestamp列实际是Excel的时间数值(比如42分钟对应的数字是0.0291666666666667,代表一天的占比),可以直接通过数值转换:

Import-Csv foo.csv | 
    Select-Object *, @{
        Name = 'timestamp'
        Expression = {
            # Excel时间数字 × 一天总秒数 = 时间间隔
            $excelTimeValue = [double]$_.timestamp
            $timeSpan = [TimeSpan]::FromSeconds($excelTimeValue * 86400)
            ([datetime]::Today + $timeSpan).ToString('h:mm:ss tt')
        }
    } -ExcludeProperty timestamp | 
    Export-Csv -NoTypeInformation foo2.csv

你提供的Excel截图显示了自定义数字格式设置界面:当前选中的是mm:ss.0格式,高亮的目标格式为h:mm:ss AM/PM。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:24:18