如何在Stata中按周正确折叠数据?

如何在Stata中按周正确折叠数据?,stata,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

我有一个事务级数据集,我想折叠并计算每周平均价格。数据集可以简化如下:

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的
日期应为2010年1月11日。但由于当天没有交易,因此日期变为2010年1月4日。有办法解决这个问题吗

(我正在考虑构建一个新的数据集,从2010年1月1日开始,使用连续的日期,然后与上面的数据集合并,如果缺少价格数量,则删除数据集。但我想知道是否有更有效的方法)


此外,我有一个每周指数数据,从2010年1月1日起每周五都会报告。如果我使用
wofd
命令,Stata将在2010年生成53周。(或者更准确地说,两个2010w52)我怎么能在Stata呆上52周


(我发现了这一点,但我仍然不知道这如何帮助解决我的问题。)

你的工作周从周一开始。通过使用
dow()
利用以下事实,您所需的一切如下:在您的每一周中,day of week函数
dow()
在周一到周日的每一天都会产生1、2、3、4、5、6、0

每日日期的当前或前一个星期一仅为

 gen Monday = cond(dow(daily) == 0, daily - 6, daily - dow(daily) + 1) 
树枝是这样的。如果是星期天,前一个星期一是6天前。否则,本周开始的星期一是今天(如果是星期一),
dow()
收益率为1,昨天(如果是星期二)收益率为2,依此类推。这里的变量
Monday
只是定义周的星期一的日期

重要细节:这里没有假设数据中的日期是否完整,甚至顺序是否正确

小提示:像
date2
date3
这样的任意名称没有什么意义。在你的问题(和练习)中使用能唤起你回忆的名字

罗伯特·费勒提到的那篇文章有一个续集<代码>搜索周,sj
在Stata中获取参考

不要使用Stata's weeks,尤其是不要使用
wofd()
功能(不是命令),因为它们帮不了你。斯塔塔的几周不会映射到你的几周。罗伯特·费勒(Robert Ferrer)提到的这篇文章确实值得一读,以理解这一点(即使是我写的)


(这些都在您链接到的Statalist线程中进行了解释。)

您的工作周从周一开始。通过使用
dow()
利用以下事实,您所需的一切如下:在您的每一周中,day of week函数
dow()
在周一到周日的每一天都会产生1、2、3、4、5、6、0

每日日期的当前或前一个星期一仅为

 gen Monday = cond(dow(daily) == 0, daily - 6, daily - dow(daily) + 1) 
树枝是这样的。如果是星期天,前一个星期一是6天前。否则,本周开始的星期一是今天(如果是星期一),
dow()
收益率为1,昨天(如果是星期二)收益率为2,依此类推。这里的变量
Monday
只是定义周的星期一的日期

重要细节:这里没有假设数据中的日期是否完整,甚至顺序是否正确

小提示:像
date2
date3
这样的任意名称没有什么意义。在你的问题(和练习)中使用能唤起你回忆的名字

罗伯特·费勒提到的那篇文章有一个续集<代码>搜索周,sj在Stata中获取参考

不要使用Stata's weeks,尤其是不要使用
wofd()
功能(不是命令),因为它们帮不了你。斯塔塔的几周不会映射到你的几周。罗伯特·费勒(Robert Ferrer)提到的这篇文章确实值得一读,以理解这一点(即使是我写的)


(这些都在您链接到的Statalist线程中进行了解释。)

您的工作周从周一开始。通过使用
dow()
利用以下事实,您所需的一切如下:在您的每一周中,day of week函数
dow()
在周一到周日的每一天都会产生1、2、3、4、5、6、0

每日日期的当前或前一个星期一仅为

 gen Monday = cond(dow(daily) == 0, daily - 6, daily - dow(daily) + 1) 
树枝是这样的。如果是星期天,前一个星期一是6天前。否则,本周开始的星期一是今天(如果是星期一),
dow()
收益率为1,昨天(如果是星期二)收益率为2,依此类推。这里的变量
Monday
只是定义周的星期一的日期

重要细节:这里没有假设数据中的日期是否完整,甚至顺序是否正确

小提示:像
date2
date3
这样的任意名称没有什么意义。在你的问题(和练习)中使用能唤起你回忆的名字

罗伯特·费勒提到的那篇文章有一个续集<代码>搜索周,sj在Stata中获取参考

不要使用Stata's weeks,尤其是不要使用
wofd()
功能(不是命令),因为它们帮不了你。斯塔塔的几周不会映射到你的几周。罗伯特·费勒(Robert Ferrer)提到的这篇文章确实值得一读,以理解这一点(即使是我写的)


(这些都在您链接到的Statalist线程中进行了解释。)

您的工作周从周一开始。您需要的一切都来自于使用