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

