将季度数据与每日数据excel匹配

将季度数据与每日数据excel匹配,excel,Excel,给出一些如下所示的数据: date CAY 1/31/1952 0.02 2/29/1952 0.03 3/31/1952 0.02 4/30/1952 0.03 1/31/1953 0.03 2/28/1953 0.03 3/31/1953 0.03 4/30/1953 0.02 1/31/1954 0.03 2/28/1954 0.03 3/31/1954 0.03 4/30/1954 0.03 1/31/1955 0.04 2/28

给出一些如下所示的数据:

date    CAY
1/31/1952   0.02
2/29/1952   0.03
3/31/1952   0.02
4/30/1952   0.03
1/31/1953   0.03
2/28/1953   0.03
3/31/1953   0.03
4/30/1953   0.02
1/31/1954   0.03
2/28/1954   0.03
3/31/1954   0.03
4/30/1954   0.03
1/31/1955   0.04
2/28/1955   0.03
3/31/1955   0.02
4/30/1955   0.02
1/31/1956   0.01
2/29/1956   0.00
3/31/1956   0.00
4/30/1956   0.00
这些日期具有误导性。一月份的值实际上是季度值,这意味着我希望从1952年1月31日到1952年3月31日的每个日值都是0.02

更具体地说,如果季度是我上面数据中的1/2/3/4个月:

Quarter        Report period    
1              January 1 through March 31
2              April 1 through June 30
3              July 1 through September 30
4              October 1 through December 31
预期产出:

date        CAY
1/2/1952    0.02
1/3/1952    0.02
1/4/1952    0.02
1/7/1952    0.02
1/8/1952    0.02
1/9/1952    0.02
1/10/1952   0.02
1/11/1952   0.02
1/14/1952   0.02
1/15/1952   0.02
1/16/1952   0.02
1/17/1952   0.02
1/18/1952   0.02
1/21/1952   0.02
1/22/1952   0.02
1/23/1952   0.02
1/24/1952   0.02
1/25/1952   0.02
1/28/1952   0.02
1/29/1952   0.02
1/30/1952   0.02
1/31/1952   0.02
2/1/1952    0.02
...
4/1/1952    0.03
4/2/1952    0.03
...
7/1/1952    0.02
....
11/1/1952   0.03

如何在excel中轻松完成此操作?

在表1中的数据中运行此操作

Option Explicit

Sub dailyData()
    Dim vals As Variant, d As Long, fd As Long, ld As Long

    With Worksheets("sheet1")
        fd = DateSerial(Year(Application.Min(.Columns(1))), 1, 1)
        ld = DateSerial(Year(Application.Max(.Columns(1))), 12, 31)
        ReDim vals(1 To (ld - fd + 2), 1 To 2)

        vals(1, 1) = "date": vals(1, 2) = "CAY"

        For d = fd To ld
            vals(d - fd + 2, 1) = d
            vals(d - fd + 2, 2) = .Cells(Application.Match(CLng(DateSerial(Year(d), Int((Month(d) - 1) / 3) + 2, 0)), .Columns("A"), 0), "B").Value
        Next d

        .Cells(1, "C").Resize(UBound(vals, 1), UBound(vals, 2)) = vals
        .Cells(1, "C").Resize(UBound(vals, 1), 1).NumberFormat = "mm/dd/yyyy"
    End With
End Sub

在表1上的数据中运行此操作

Option Explicit

Sub dailyData()
    Dim vals As Variant, d As Long, fd As Long, ld As Long

    With Worksheets("sheet1")
        fd = DateSerial(Year(Application.Min(.Columns(1))), 1, 1)
        ld = DateSerial(Year(Application.Max(.Columns(1))), 12, 31)
        ReDim vals(1 To (ld - fd + 2), 1 To 2)

        vals(1, 1) = "date": vals(1, 2) = "CAY"

        For d = fd To ld
            vals(d - fd + 2, 1) = d
            vals(d - fd + 2, 2) = .Cells(Application.Match(CLng(DateSerial(Year(d), Int((Month(d) - 1) / 3) + 2, 0)), .Columns("A"), 0), "B").Value
        Next d

        .Cells(1, "C").Resize(UBound(vals, 1), UBound(vals, 2)) = vals
        .Cells(1, "C").Resize(UBound(vals, 1), 1).NumberFormat = "mm/dd/yyyy"
    End With
End Sub

要生成日期,请输入并选择第一个日期,然后单击“主页”选项卡->编辑->填充->系列

然后在第一个日期的旁边尝试这个公式,并将A2填入第一个日期的单元格,并按季度调整!A:B到源范围:

=LOOKUP( DATE(YEAR(A2), INT((MONTH(A2) - 1) / 3) + 2, 0), quarterly!A:B)

要生成日期,请输入并选择第一个日期,然后单击“主页”选项卡->编辑->填充->系列

然后在第一个日期的旁边尝试这个公式,并将A2填入第一个日期的单元格,并按季度调整!A:B到源范围:

=LOOKUP( DATE(YEAR(A2), INT((MONTH(A2) - 1) / 3) + 2, 0), quarterly!A:B)

以下是我所说的帮助器列——非常基本,但确实有效

在C2中

在D2中

在E2中

在G2中

在I2中


因此,列G包含91 1的91 2的92 3等,用于索引回原始数据。

以下是我所说的辅助列-非常基本,但确实有效

在C2中

在D2中

在E2中

在G2中

在I2中



因此,G列包含91 1的91 2的92 3等,用于索引回原始数据。

季度数据没有每日数据的粒度,我不知道如何从其他数据中提取一个。你能公布预期结果吗?为了我的研究目的,我只需要有每日数据,如果这一天在我有信息的季度范围内,那一天就会得到该季度的价值。我将用预期输出更新OP。这是本季度的最小值还是第一个值?您可以使用类似INTMONTHA3/3的内容获取季度,并使用IF函数比较上述日期的年份和季度,以确定要获取的值i每个季度只有1个值,存储为月份。1952年1月31日是1952年的第一季度,1952年2月28日是1952年的第二季度,等等。这样行吗?所以你的日期不是实际日期,而是季度/天/年?那么我想你需要某种查找功能。季度数据没有日常数据的粒度,我不知道如何从另一个数据中提取一个。你能公布预期结果吗?为了我的研究目的,我只需要有每日数据,如果这一天在我有信息的季度范围内,那一天就会得到该季度的价值。我将用预期输出更新OP。这是本季度的最小值还是第一个值?您可以使用类似INTMONTHA3/3的内容获取季度,并使用IF函数比较上述日期的年份和季度,以确定要获取的值i每个季度只有1个值,存储为月份。1952年1月31日是1952年的第一季度,1952年2月28日是1952年的第二季度,等等。这样行吗?所以你的日期不是实际日期,而是季度/天/年?然后我想您需要某种查找函数..我似乎遇到了这样的错误:对象不支持此属性或方法。“我的日期”列的格式为日期,值的格式为数字。怎么了?您没有提到错误发生在哪一行,但您可以尝试将Application.Daysld,fd+2更改为ld-fd+2。它似乎没有告诉我错误发生在哪一行,但经过您建议的更改,现在会出现类型不匹配错误。我对代码的唯一调整是将sheet1更改为实际的工作表名称,这是每季度一次的。@ÉvaristeGalois在VBA编辑器中更改错误捕获以中断类模块:工具->选项->常规外观,就像错误出现在这一行valsd-fd+2,2=.CellsApplication.MatchCLngDateSerialYeard,IntMonthd-1/3+2,0,.ColumnsA,0,B.ValueI似乎出现此错误:对象不支持此属性或方法。“我的日期”列的格式为日期,值的格式为数字。怎么了?您没有提到错误发生在哪一行,但您可以尝试将Application.Daysld,fd+2更改为ld-fd+2。它似乎没有告诉我错误发生在哪一行,但经过您建议的更改,现在会出现类型不匹配错误。我对代码的唯一调整是将sheet1更改为实际的工作表名称,这是每季度一次的。@ÉvaristeGalois在VBA编辑器中更改错误捕获以中断类模块:工具->选项->常规外观,就像错误出现在这一行valsd-fd+2,2=.CellsApplication.MatchCLngDateSerialYeard,IntMonthd-1/3+2,0,.ColumnsA,0,B.值
=D2-C2+1
=IF(G1="",1,IF(COUNTIF($G$1:G1,G1)<INDEX($A$2:$E$10,G1,5),G1,G1+1))
=IF(G1=G2,H1+1,INDEX($A$2:$E$10,G2,3))
=INDEX($A$2:$E$10,G2,2)