GetDateRange.ps1

function Get-DateRange {
    <#
        .Synopsis
        Return a fixed frequency Datetime Index
 
        .Example
        Get-DateRange 1/1/2020 -periods 6
 
        2020-01-01
        2020-01-02
        2020-01-03
        2020-01-04
        2020-01-05
        2020-01-06
 
        .Example
        New-DataFrame (Get-DateRange 1/1/2020 -periods 3 -freq M) a,b,c
 
Index a b c
----- - - -
2020-01-01 [missing] [missing] [missing]
2020-02-01 [missing] [missing] [missing]
2020-03-01 [missing] [missing] [missing]
 
        .Example
        Get-DateRange 1/1/2020 -periods 6 -freq M
 
        2020-01-01
        2020-02-01
        2020-03-01
        2020-04-01
        2020-05-01
        2020-06-01
 
        .Example
        Get-DateRange 1/1/2020 -periods 6 -freq Y
 
        2020-01-01
        2021-01-01
        2022-01-01
        2023-01-01
        2024-01-01
        2025-01-01
 
        .Example
        Get-DateRange 1/1/2020 1/5/2020 -periods 3
 
        2020-01-01
        2020-01-02
        2020-01-05
 
    #>

    param(
        [datetime]$start = (Get-Date),
        [datetime]$end,
        $periods,
        [ValidateSet('D', 'M', 'Y')]
        $freq = 'D'
    )

    switch ($freq) {
        'D' { $targetMethod = 'AddDays' }
        'M' { $targetMethod = 'AddMonths' }
        'Y' { $targetMethod = 'AddYears' }
    }

    $fmt = 'yyyy-MM-dd'

    if ((@{ } + $PSBoundParameters).count -eq 0) {
        $n = 0
    }
    else {
        $n = $periods - 1
    }

    if ($end) {
        $totalNumberOfDates = ($end - $start).totaldays
        if (!$periods) {
            $n = $totalNumberOfDates
        }
    }

    $r = 0..$n | ForEach-Object { $start.$targetMethod($_).ToString($fmt) }

    # set the last element to the end date
    if ($totalNumberOfDates -gt $periods) {
        $r[-1] = $start.$targetMethod($totalNumberOfDates).ToString($fmt)
    }

    $r
}