You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

dtdatetime
1/1/2016 1:00:0001jan2016 01:00:27
1/1/2016 2:00:0001jan2016 01:59:25
1/1/2016 3:00:0001jan2016 03:00:35
1/1/2016 4:00:0001jan2016 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:54:03