如何在 Stata 中正确地按周折叠数据?
How to collapse data by week correctly in Stata?
我有一个交易级数据集,我想折叠并计算每周平均价格。数据集可以简化如下,
clear
input str9 date quantity price id
"01jan2010" 50 70 1
"02jan2010" 60 80 2
"02jan2010" 70 90 3
"04jan2010" 70 95 4
"08jan2010" 60 81 5
"09jan2010" 70 88 6
"12jan2010" 55 87 7
"13jan2010" 52 88 8
end
gen date2=date(date,"DMY")
format date2 %td
drop date
我想创建一个变量date3
。对于一周内发生的每笔交易,date3
是该周的星期一。
这是我的代码:
sort date2
gen date3=date2 if dow(date2)==1
replace date3=date3[_n-1] if missing(date3)
format date3 %td
不过也有周一没有成交,但其余时间有成交。在这些情况下,date3
不是该周的星期一日期,而是前几周的星期一日期。
我的数据使用上面的代码变成如下:
quantity price id date2 date3
50 70 1 01jan2010
60 80 2 02jan2010
70 90 3 02jan2010
70 95 4 04jan2010 04jan2010
60 81 5 08jan2010 04jan2010
70 88 6 09jan2010 04jan2010
55 87 7 12jan2010 04jan2010
52 88 8 13jan2010 04jan2010
对我来说,id
=1,2,3没有date3
也没关系。我担心的是 id
=7 和 id
=8 的 date3
应该是 11jan2010。但是因为当天没有交易,日期变成了04jan2010。有办法解决这个问题吗?
(我正在考虑构建一个自 01jan2010 以来具有连续日期的新数据集,然后 merge
与上面的那个,然后 drop
如果缺少价格数量。但我想知道是否有一种更有效的方法)。
此外,我有一个每周指数数据,自 2010 年 1 月 1 日起每周五报告。如果我使用 wofd
命令,Stata 将在 2010 年生成 53 周。(或更准确地说,两个 2010w52。)我如何在 Stata 中获得 52 周?
(我找到了这个 http://www.stata.com/statalist/archive/2012-02/msg01030.html 但我仍然无法弄清楚它如何帮助解决我的问题。)
您的周从星期一开始。您需要的一切都来自于使用 dow()
来利用这样一个事实,即在您的每个星期中,星期几函数 dow()
会产生 1、2、3、4、5、6、0 这几天从周一到周日。
每日日期 daily
的当前或上周一正好是
gen Monday = cond(dow(daily) == 0, daily - 6, daily - dow(daily) + 1)
分支是这样的。如果是星期天,则前一个星期一是 6 天前。否则,一周开始的星期一是今天,如果是星期一并且 dow()
产生 1,如果是星期二则为昨天和 2,依此类推。这里变量 Monday
只是定义周的星期一的日期。
重要细节:这里没有假设数据中的日期是完整的,甚至是按顺序排列的。
小提示:date2
和 date3
等任意名称没有多大意义。在你的问题(和你的练习)中使用令人回味的名字。
Robert Ferrer 提到的文章有一个 sequel。 search week, sj
在 Stata 中获取参考。
不要不要使用Stata的星期,特别是不要不要使用wofd()
函数(不是命令),因为他们帮不了你。 Stata 的周数不会映射到您的周数。 Robert Ferrer 提到的文章确实值得一读以理解这一点(即使是我写的)。
(这在您 link 的 Statalist 线程中都有解释。)
我有一个交易级数据集,我想折叠并计算每周平均价格。数据集可以简化如下,
clear
input str9 date quantity price id
"01jan2010" 50 70 1
"02jan2010" 60 80 2
"02jan2010" 70 90 3
"04jan2010" 70 95 4
"08jan2010" 60 81 5
"09jan2010" 70 88 6
"12jan2010" 55 87 7
"13jan2010" 52 88 8
end
gen date2=date(date,"DMY")
format date2 %td
drop date
我想创建一个变量date3
。对于一周内发生的每笔交易,date3
是该周的星期一。
这是我的代码:
sort date2
gen date3=date2 if dow(date2)==1
replace date3=date3[_n-1] if missing(date3)
format date3 %td
不过也有周一没有成交,但其余时间有成交。在这些情况下,date3
不是该周的星期一日期,而是前几周的星期一日期。
我的数据使用上面的代码变成如下:
quantity price id date2 date3
50 70 1 01jan2010
60 80 2 02jan2010
70 90 3 02jan2010
70 95 4 04jan2010 04jan2010
60 81 5 08jan2010 04jan2010
70 88 6 09jan2010 04jan2010
55 87 7 12jan2010 04jan2010
52 88 8 13jan2010 04jan2010
对我来说,id
=1,2,3没有date3
也没关系。我担心的是 id
=7 和 id
=8 的 date3
应该是 11jan2010。但是因为当天没有交易,日期变成了04jan2010。有办法解决这个问题吗?
(我正在考虑构建一个自 01jan2010 以来具有连续日期的新数据集,然后 merge
与上面的那个,然后 drop
如果缺少价格数量。但我想知道是否有一种更有效的方法)。
此外,我有一个每周指数数据,自 2010 年 1 月 1 日起每周五报告。如果我使用 wofd
命令,Stata 将在 2010 年生成 53 周。(或更准确地说,两个 2010w52。)我如何在 Stata 中获得 52 周?
(我找到了这个 http://www.stata.com/statalist/archive/2012-02/msg01030.html 但我仍然无法弄清楚它如何帮助解决我的问题。)
您的周从星期一开始。您需要的一切都来自于使用 dow()
来利用这样一个事实,即在您的每个星期中,星期几函数 dow()
会产生 1、2、3、4、5、6、0 这几天从周一到周日。
每日日期 daily
的当前或上周一正好是
gen Monday = cond(dow(daily) == 0, daily - 6, daily - dow(daily) + 1)
分支是这样的。如果是星期天,则前一个星期一是 6 天前。否则,一周开始的星期一是今天,如果是星期一并且 dow()
产生 1,如果是星期二则为昨天和 2,依此类推。这里变量 Monday
只是定义周的星期一的日期。
重要细节:这里没有假设数据中的日期是完整的,甚至是按顺序排列的。
小提示:date2
和 date3
等任意名称没有多大意义。在你的问题(和你的练习)中使用令人回味的名字。
Robert Ferrer 提到的文章有一个 sequel。 search week, sj
在 Stata 中获取参考。
不要不要使用Stata的星期,特别是不要不要使用wofd()
函数(不是命令),因为他们帮不了你。 Stata 的周数不会映射到您的周数。 Robert Ferrer 提到的文章确实值得一读以理解这一点(即使是我写的)。
(这在您 link 的 Statalist 线程中都有解释。)