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

如何使用PowerShell按周对CSV交易记录的日期进行分组?

PowerShell按周分组CSV交易记录

你需要基于「Transaction Date」字段,按7天区间(如8/31至8/24、8/24至8/17)对CSV交易记录分组,以下是更可靠的实现方案:

现有代码的问题

你的当前实现存在几个局限:

  • 依赖CSV必须降序排列,数据顺序变动会导致分组逻辑失效
  • 仅逐条输出符合区间的记录,没有完成真正的分组聚合,无法便捷统计每组的汇总数据
  • 边界判断逻辑不够严谨,遇到日期跳变时可能出现分组错误

通用分组方案

不管原CSV的排序状态,通过计算每条记录所属的周区间来分组,逻辑清晰且可靠:

步骤说明

  1. 读取CSV并转换交易日期为datetime类型
  2. 找出所有交易日期中的最大值,以此为基准划分周区间
  3. 为每条记录添加所属的周区间属性
  4. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:45:25