我在互联网上寻求以下帮助,但找不到令人满意的答案:对于一项作业,我需要绘制某个变量的时间序列(术语以百分比形式分布),并以年份为单位x 轴。
但是,我们使用每日数据。有谁知道可以完成此操作的便捷方法吗?我得到的“日期”变量的格式如下:20111017 代表 2011 年 10 月 17 日。
我尝试使用
substr(date, 1, 4)
命令提取变量“日期”的前 4 个数字,但弹出消息“类型不匹配”。另外,如果我只使用年份来绘制每日数据(多年来),我不太确定它是否提供了正确的信息。现在它给出了以下 ,看起来不太好。
回答你标题中的问题。
date()
函数需要一个字符串。如果您的值为 20111017
的变量采用数字格式,您可以像这样转换它:tostring datenum , gen(datestr)
。
然后,当使用
date()
函数时,您必须提供一个 mask 来告诉 Stata 日期字符串的格式。下面是一个可重现的示例,您可以运行看看它是如何工作的。
* Example generated by -dataex-. For more info, type help dataex
clear
input float datenum
20111016
end
* Convert numeric variable 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 |
+-----------------------------+