如何在PowerShell中使用Import-Excel修改对象属性分组的日期格式
按日期(不含时间戳)分组Excel数据并汇总金额的问题
我使用PowerShell的Import-Excel模块将Excel中的日期列导入为对象数组,想要按日期分组并汇总对应类型的金额,但遇到了时间戳干扰分组的问题。虽然模块的-AsDate参数能将数值日期转为日期类型,但原数据的日期格式是MM-dd-yyyy HH:mm:ss,包含时间戳,导致同一天不同时间的记录无法被正确归为一组。
示例Excel数据
Date Type Amount 1-1-2021 3:10:06 AM Level 1 $1.00 1-1-2021 5:11:03 AM Level 1 $2.00 1-2-2021 4:34:06 AM Level 1 $3.00 1-1-2021 1:56:05 AM Level 2 $4.00 1-1-2021 7:23:04 AM Level 2 $5.00 1-2-2021 9:16:00 AM Level 1 $4.00
尝试的代码
$result = Import-Excel -Path "C:\SampleData.xlsx" -AsDate Date | Group-Object Date | ForEach-Object { $_.Group | Group-Object Type | ForEach-Object { $sum = [System.Linq.Enumerable]::Sum([double[]] $_.Group.Amount) $_.Group[0].Amount = $sum.ToString('C2') $_.Group[0].Date = Get-Date $_.Group[0].Date -format 'yyyy-MM-dd' $_.Group[0] } } $result
当前错误结果
Date Type Amount 1-1-2021 Level 1 $1.00 1-1-2021 Level 1 $2.00 1-2-2021 Level 1 $3.00 1-1-2021 Level 2 $4.00 1-1-2021 Level 2 $5.00 1-2-2021 Level 1 $4.00
预期结果
Date Type Amount 1-1-2021 Level 1 $3.00 1-2-2021 Level 1 $7.00 1-1-2021 Level 2 $9.00
解决方案
问题根源在于分组时使用了包含时间戳的原始Date对象,导致同一天不同时间的记录被分成了不同组。需要先将日期处理为仅含年月日的形式,再作为分组依据。
修改后的代码:
$result = Import-Excel -Path "C:\SampleData.xlsx" -AsDate Date | # 按日期的"纯日期部分"(自动去除时间戳)和Type同时分组 Group-Object @{ Expression = { $_.Date.Date }; Name = 'Date' }, Type | ForEach-Object { $sum = [System.Linq.Enumerable]::Sum([double[]] $_.Group.Amount) # 生成新的汇总对象 [PSCustomObject]@{ Date = Get-Date $_.Values[0] -Format 'MM-dd-yyyy' Type = $_.Values[1] Amount = $sum.ToString('C2') } } $result
代码说明
- 分组逻辑优化:使用
$_.Date.Date直接提取日期对象的纯日期部分(自动剔除时间戳),结合Type一次性完成分组,避免嵌套Group-Object的冗余操作。 - 生成干净结果:不再修改原始分组对象,直接创建新的
PSCustomObject输出汇总数据,确保结果格式完全符合预期。
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

