Stata:双精度的日期比较
我想把数据除以某个日期时间 例如,我从最初的字符串“2019-10-15 20:33:04”创建了Stata:双精度的日期比较,stata,Stata,我想把数据除以某个日期时间 例如,我从最初的字符串“2019-10-15 20:33:04”创建了e_time 为了从包含h:m:s的字符串中获取所有信息,我使用以下命令创建一个double gen double e_time = clock(event_timestamp, "YMDhms") 现在,我从格式e_time%tc(人类可读)中得到了我想要的结果, 我想生成一个新变量任何大于2019-10-15的变量都是1,小于该变量的变量都是0 我试过了 // 1 g
e_time
为了从包含h:m:s的字符串中获取所有信息,我使用以下命令创建一个double
gen double e_time = clock(event_timestamp, "YMDhms")
现在,我从格式e_time%tc
(人类可读)中得到了我想要的结果,
我想生成一个新变量
任何大于2019-10-15的变量都是1,小于该变量的变量都是0
我试过了
// 1
gen new_d = 0 if e_time < "1.887e+12"
replace new_d = 1 if e_time >= "1.887e+12"
// 2
gen new_d = 0 if e_time < "2019-10-15"
replace new_d = 1 if e_time > "2019-10-15"
但它不起作用
任何人都可以就如何正确比较双精度格式的日期给出建议吗?您的帖子有点难理解(一个可复制的数据示例会很有帮助),但错误的
类型不匹配是因为e_time
是数字,而“2019-10-15”
是字符串
我建议如下:
clear
input str20 datetime
"2019-10-14 20:33:04"
"2019-10-16 20:33:04"
end
* Keep first 10 characters
gen date = substr(datetime,1,10)
* Check that all strings are 10 characters
assert length(date) == 10
* Convert from string to numeric date variable
gen m = substr(date,6,2)
gen d = substr(date,9,2)
gen y = substr(date,1,4)
destring m d y, replace
gen newdate = mdy(m,d,y)
format newdate %d
gen wanted = newdate >= mdy(10,15,2019) & !missing(newdate)
drop date m d y
list
+------------------------------------------+
| datetime newdate wanted |
|------------------------------------------|
1. | 2019-10-14 20:33:04 14oct2019 0 |
2. | 2019-10-16 20:33:04 16oct2019 1 |
+------------------------------------------+
非常感谢你的建议!但是,我需要将h:m:s部分专门保留在result datetime中,然后进行比较。似乎当前日期时间忽略了h:m:s部分。输入str20 datetime“2019-10-14 20:33:04”“2019-10-14 20:33:04”gen double date=clock(datetime,“YMDhms”)gen group=0 if date<“2019-10-15”replace group=1 if date>“2019-10-15”正是我想要做的,但正如您所看到的,我已经创建了一个日期对象作为double,这会导致类型不匹配问题。。如果我把你弄糊涂了,请原谅,我会一如既往地帮助你。我已经编辑掉了一个指示符变量不必要的generate replace
两步操作。在一行中做这件事在很多地方都有解释,比如和@LeeVincent,是的,这不起作用,因为你要把一个数值变量和一个字符串进行比较。你试过我答案中的答案了吗?最后一个generate
语句中的mdy()
函数是关键。谢谢你,尼克,很容易知道。干杯。谢谢@Nick Cox和@Cybernike!1) @Nick,我其实不知道用一行就可以做到,但多亏了你的推荐,现在我发现生成-替换两步流程是不必要的。非常感谢。2) @Cybernike是的,我做了,特别是它也适用于整个数据集。我真的不知道substr()能做什么,所以我花了一段时间才真正理解运行代码时发生的事情。但现在我知道了!我是斯塔塔的新手,实际上我从这条线索中学到了很多。感谢大家分享您的知识:)在这里学习如何显示代码并不难。为代码行缩进4个空格;在提到代码时使用反勾号。(以编辑为例)在计算中,“格式”一词过载,这不是您的错,但请注意,在Statadouble
中,它是一种变量或存储类型,而不是一种显示格式。“双重格式”的表达可以在心里翻译,但在Stata问题中使用Stata术语始终是最好的主意。@NickCox非常感谢您的澄清。另外,您建议的关于消除冗余生成替换的参考资料非常有用!谢谢:)
clear
input str20 datetime
"2019-10-14 20:33:04"
"2019-10-16 20:33:04"
end
* Keep first 10 characters
gen date = substr(datetime,1,10)
* Check that all strings are 10 characters
assert length(date) == 10
* Convert from string to numeric date variable
gen m = substr(date,6,2)
gen d = substr(date,9,2)
gen y = substr(date,1,4)
destring m d y, replace
gen newdate = mdy(m,d,y)
format newdate %d
gen wanted = newdate >= mdy(10,15,2019) & !missing(newdate)
drop date m d y
list
+------------------------------------------+
| datetime newdate wanted |
|------------------------------------------|
1. | 2019-10-14 20:33:04 14oct2019 0 |
2. | 2019-10-16 20:33:04 16oct2019 1 |
+------------------------------------------+