Stata使用clock()转换字符串为datetime出现时分秒错误问题
目标
我需要将格式为"MM/DD/YYYY HH:MM:SS"的字符串变量,通过clock()函数转换为Stata可识别的datetime类型。
问题描述
转换得到的datetime值和输入的原始字符串不匹配,我使用的代码如下:
gen datetime = clock(dt, "MDY hms") format datetime %tc
转换前后的数据对比如下,其中原始字符串变量dt为str19类型,格式为%19s,转换后的变量datetime为float类型,格式为%tc:
| dt | datetime |
|---|---|
| 1/1/2016 1:00:00 | 01jan2016 01:00:27 |
| 1/1/2016 2:00:00 | 01jan2016 01:59:25 |
| 1/1/2016 3:00:00 | 01jan2016 03:00:35 |
| 1/1/2016 4:00:00 | 01jan2016 03:59:34 |
已尝试操作
我已经查阅了Stata用户手册第24章日期与时间处理、Datetime translation相关文档,没有找到问题原因,请求帮助。
示例数据
clear input str19 dt "1/1/2016 1:00:00" "1/1/2016 2:00:00" "1/1/2016 3:00:00" "1/1/2016 4:00:00" "1/1/2016 5:00:00" "1/1/2016 6:00:00" "1/1/2016 7:00:00" "1/1/2016 8:00:00" "1/1/2016 9:00:00" "1/1/2016 10:00:00" end
问题原因与解决方案
问题核心是clock()函数返回的是毫秒级时间戳,数值范围远超float类型的精度上限,Statagen命令默认生成float类型变量,无法完整存储时间戳,导致精度丢失出现秒级偏差。
解决方案为生成变量时指定存储类型为double即可:
gen double datetime = clock(dt, "MDY hms") format datetime %tc
修改后转换结果会和原始字符串完全匹配。float类型的有效位数仅约7位,而2016年对应的Stata datetime毫秒戳数值已经超过1.7×10^12,远远超出float的精度承载能力,必然会出现舍入误差,double类型有效位数约16位,可完整存储毫秒级时间戳。
内容的提问来源于stack exchange,提问作者user15742435
相关产品推荐
相关产品推荐

