如何使用PowerShell按周对CSV交易记录的日期进行分组?
PowerShell按周分组CSV交易记录
你需要基于「Transaction Date」字段,按7天区间(如8/31至8/24、8/24至8/17)对CSV交易记录分组,以下是更可靠的实现方案:
现有代码的问题
你的当前实现存在几个局限:
- 依赖CSV必须降序排列,数据顺序变动会导致分组逻辑失效
- 仅逐条输出符合区间的记录,没有完成真正的分组聚合,无法便捷统计每组的汇总数据
- 边界判断逻辑不够严谨,遇到日期跳变时可能出现分组错误
通用分组方案
不管原CSV的排序状态,通过计算每条记录所属的周区间来分组,逻辑清晰且可靠:
步骤说明
- 读取CSV并转换交易日期为
datetime类型 - 找出所有交易日期中的最大值,以此为基准划分周区间
- 为每条记录添加所属的周区间属性
- 使用
Group-Object按区间分组,按需完成聚合统计
完整代码
# 替换为你的CSV文件路径 $csvPath = "交易记录.csv" $csv = Import-Csv -Path $csvPath # 获取所有交易日期的datetime对象,找出最晚的日期 $allDates = $csv | ForEach-Object { [datetime]$_.['Transaction Date'] } $latestDate = ($allDates | Measure-Object -Maximum).Maximum # 为每条记录添加周区间属性,再按区间分组 $groupedData = $csv | ForEach-Object { $currentDate = [datetime]$_.['Transaction Date'] # 计算当前日期与最晚日期的天数差,确定所属周组的索引 $daysFromLatest = ($latestDate - $currentDate).Days $groupIndex = [math]::Floor($daysFromLatest / 7) # 计算当前组的区间上下限(上限为区间最晚日期,下限为上限减7天) $weekUpper = $latestDate.AddDays(-$groupIndex * 7) $weekLower = $weekUpper.AddDays(-7) $intervalStr = "{0:M/d/yyyy}至{1:M/d/yyyy}" -f $weekUpper, $weekLower # 为当前记录添加区间属性并传递 $_ | Add-Member -NotePropertyName "Week Interval" -NotePropertyValue $intervalStr -PassThru } | Group-Object -Property "Week Interval" # 输出分组结果及汇总数据 foreach ($group in $groupedData) { Write-Host -ForegroundColor Cyan "=== 周区间: $($group.Name) ===" # 输出组内交易明细 $group.Group | Select-Object 'Transaction Date', Description, Debit # 计算并输出该周总支出 $totalDebit = ($group.Group.Debit | Measure-Object -Sum).Sum Write-Host -ForegroundColor Yellow "该周总支出: $totalDebit`n" }
代码优势
- 不依赖数据排序,适配任意顺序的CSV文件
- 明确生成每个记录的所属区间,分组逻辑直观可查
- 支持快速扩展聚合操作(如统计交易次数、分类支出等)
基于降序CSV的简化方案(可选)
如果你的CSV确定始终是降序排列,可以调整你的原有逻辑,完成真正的分组:
$csv = Import-Csv -Path "交易记录.csv" $groups = @() $currentGroup = @() $currentWeekEnd = $null foreach ($item in $csv) { $currentDate = [datetime]$item.'Transaction Date' if (-not $currentWeekEnd) { $currentWeekEnd = $currentDate $currentWeekStart = $currentWeekEnd.AddDays(-7) } if ($currentDate -ge $currentWeekStart) { $currentGroup += $item } else { # 保存当前组 $groups += [PSCustomObject]@{ Interval = "{0:M/d/yyyy}至{1:M/d/yyyy}" -f $currentWeekEnd, $currentWeekStart Transactions = $currentGroup } # 初始化新组 $currentWeekEnd = $currentDate $currentWeekStart = $currentWeekEnd.AddDays(-7) $currentGroup = @($item) } } # 保存最后一个组 $groups += [PSCustomObject]@{ Interval = "{0:M/d/yyyy}至{1:M/d/yyyy}" -f $currentWeekEnd, $currentWeekStart Transactions = $currentGroup } # 输出结果 foreach ($group in $groups) { Write-Host -ForegroundColor Cyan "=== 区间: $($group.Interval) ===" $group.Transactions | Select-Object 'Transaction Date', Description, Debit $total = ($group.Transactions.Debit | Measure-Object -Sum).Sum Write-Host -ForegroundColor Yellow "总支出: $total`n" }
内容的提问来源于stack exchange,提问作者user4317867
相关产品推荐
相关产品推荐

