2

我有两个数据集。FIRST是来自供应商的产品及其每日价格SECOND的列表,并且是开始和结束日期的列表(以及用于分析的其他重要数据)。我如何告诉 Stata 将开始日期的价格拉到给定日期的结束日期的FIRST价格SECOND。请注意,如果没有精确匹配的日期,我希望它获取最后可用的日期。例如,如果SECOND日期为 2013 年 1 月 1 日,FIRST价格为 ... 2012 年 12 月 30 日、2012 年 12 月 31 日、2013 年 1 月 2 日、... 它将获取 2012 年 12 月 31 日的价格.

我通常会用 Excel 来做这件事,但我有数百万的观察结果,这是不可行的。

我已经举了一个例子,FIRST以及SECOND最佳解决方案将作为输出给出的内容POST_SECOND

FIRST
 Product          Price              Date
   1               3                1/1/2010
   1               3                1/3/2010
   1               4                1/4/2010
   1               2                1/8/2010
   2               1                1/1/2010
   2               5                2/5/2010
   3               7                12/26/2009
   3               2                1/1/2010
   3               6                4/3/2010

SECOND
Product          Start Date          End Date
   1              1/3/2010            1/4/2010
   2              1/1/2010            1/1/2010
   3              12/26/2009          4/3/2010

POST_SECOND
 Product         Start Date          End Date      Price_Start     Price_End
   1              1/3/2010            1/4/2010          3             4
   2              1/1/2010            1/1/2010          1             1
   3              12/26/2009          4/3/2010          7             6
4

2 回答 2

1

这是依赖于使用最后日期的合并/保留/排序/折叠* 解决方案。我稍微更改了您的示例数据。

/* Make Fake Data & Convert Dates to Date Format */
clear
input byte Product         byte Price            str12  str_date
   1               3                "1/1/2010"
   1               3                "1/3/2010"
   1               4                "1/4/2010"
   1               2                "1/8/2010"
   2               1                "1/1/2010"
   2               5                "2/5/2010"
   3               7                "12/26/2009"
   3               7                "12/28/2009"
   3               2                "1/1/2010"
   3               6                "4/3/2010"
   4               8                "12/30/2012"
   4               9                "12/31/2012"
   4               10               "1/2/2013"  
   4               10               "1/3/2013"  
 end

gen Date = date(str_date,"MDY")
format Date %td
drop str_date    
save "First.dta", replace

clear 
input byte Product          str12 str_Start_Date        str12  str_End_Date
   1              "1/3/2010"            "1/4/2010"
   2              "1/1/2010"            "1/1/2010"
   3              "12/27/2009"          "4/3/2010"
   4              "1/1/2013"            "1/2/2013"
end

gen Start_Date = date(str_Start_Date,"MDY")
gen End_Date = date(str_End_Date,"MDY")
format Start_Date End_Date %td
drop str_*
save "Second.dta", replace

/* Data Transformation */
use "First.dta", clear
merge m:1 Product using "Second.dta", nogen

bys Product: egen ads = min(abs(Start_Date-Date))
bys Product: egen ade = min(abs(End_Date - Date))
keep if (ads==abs(Date - Start_Date) & Date <= Start_Date) | (ade==abs(Date - End_Date) & Date <= End_Date)
sort Product Date
collapse (first) Price_Start = Price (last) Price_End = Price, by(Product Start_Date End_Date)
list, clean noobs

*有些人是重塑者。其他人是崩溃者。通常两者都可以完成工作,但我认为在这种情况下崩溃更容易。

于 2013-10-04T01:42:16.027 回答
0

在 Stata 中,我从来没有能够让这样的事情一步到位(你可以通过 SQL 调用在 SAS 中完成)。在任何情况下,我认为你最好从创建一个中间文件,FIRST.dta然后在.StartDateEndDateSECOND.dta

假设您有 2010 年 1 月 1 日至 2013 年 12 月 31 日的价格调整数据(如上所示,指定了不同的间隔)。我假设所有日期变量都已经在date format&FIRST.dtaSECOND.dta,并且变量名中SECOND没有空格。

tempfile prod prices

use FIRST.dta, clear
keep Product
duplicates drop
save `prod'

clear
set obs 1096
g Date=date("12-31-2009","MDY")+_n
format date %td
cross using `prod'

merge 1:1 Product Date using FIRST.dta, assert(1 3) nogen
gsort +Product +Date /*this ensures the data are sorted properly for the next step  */
replace price=price[_n-1] if price==. & Product==Product[_n-1]
save `prices'

use SECOND.dta, clear
foreach i in Start End {
rename `i'Date Date
merge 1:1 Product Date using `prices', assert(2 3) keep(3) nogen
rename Price Price_`i'
rename Date `i'Date 
}

如果我正确理解您的数据结构,这应该可以工作,并且它应该解决@Dimitriy 回答的评论中讨论的问题。我愿意接受关于如何让它变得更好的批评,因为它是我必须做几次的事情,这就是我通常的做法。

于 2013-10-05T01:40:39.933 回答