我在互联网上寻求以下方面的帮助,但我找不到令人满意的答案:对于一项作业,我需要绘制某个变量的时间序列(以百分比表示的术语(,x轴上有年份。
然而,我们使用日常数据。有人知道这样做的方便方法吗?我得到的"日期"变量的公式如下:20111017表示2011年10月17日。
我试图使用substr(date, 1, 4)
命令提取变量"date"的前4个数字,但弹出消息"type mismatch"。此外,如果我只使用年份来绘制(多年来的(每日数据,我不太确定它是否提供了正确的信息。现在它给出了下面的图表,看起来不太好。
回答标题中的问题。
date()
函数需要一个字符串。如果值为20111017
的变量是数字格式,则可以将其转换为:tostring datenum , gen(datestr)
。
然后,当使用date()
函数时,您必须提供一个掩码,该掩码告诉Stata日期字符串的格式。下面是一个可复制的示例,您可以运行它来了解它的工作原理。
* Example generated by -dataex-. For more info, type help dataex
clear
input float datenum
20111016
end
* Convert numberic varaible to string
tostring datenum , gen(datestr)
* Convert string to date
gen date = date(datestr, "YMD")
* Display date as date
format date %td
如果这对你没有帮助,试着提供一个可重复的例子。
这为@TheIceBear的有用答案添加了一些细节。
正如他所指出的,从一起跑步日期变量中获取Stata每日日期的一种方法是首先将其转换为字符串。但tostring
只是实现这一点的一种方法,并不是必不可少的。(作为tostring
的原作者,我并不反对它,但它更适合其他任务。(
这里我使用daily()
而不是date()
:结果是相同的,但使用daily()
是个好主意:date()
经常被误解为通用日期函数,而它所做的只是生成每日日期(或缺失(。
要得到一个数字年份变量,只需除以10000并向下四舍五入即可。您可以转换为字符串,提取前4个字符,然后转换为数字,但这是更多的操作。
clear
set obs 1
gen long date = 20111017
format date %8.0f
gen ddate = daily(strofreal(date, "%8.0f"), "YMD")
format %td ddate
gen year = floor(date/10000)
list
+-----------------------------+
| date ddate year |
|-----------------------------|
1. | 20111017 17oct2011 2011 |
+-----------------------------+