如何将%10.0g格式数值转换为yyyy-mm-dd hh:mm:ss日期格式
你数据中存储的1.9xxxe+12格式数值为毫秒级Unix时间戳,字段内.为缺失值标记,以下给出不同工具的转换实现方案,最终输出符合yyyy-mm-dd hh:mm:ss格式要求。
Stata实现方案
转换核心逻辑:Stata内置的UTC时区毫秒级时间值,以1960-01-01 00:00:00为计数起点,需要先计算Unix时间戳起点(1970-01-01 00:00:00 UTC)对应的Stata时间偏移量,做差值后再格式化输出即可。
* 以下为示例数据导入代码,实际使用时替换为你自己的数据导入逻辑 clear input ID double(Date1 Date2) 1 1929000000000 1929000000000 2 1917000000000 1901000000000 3 1922000000000 . end * 计算UTC时区下的时间偏移量,若数据使用北京时间(UTC+8),将时间改为"1970-01-01 08:00:00"即可 local offset = Clock("1970-01-01 00:00:00", "YMD hms") * 批量转换所有日期字段 foreach var of varlist Date1 Date2 { * 排除缺失值做时间值换算,必须用double类型存储避免精度丢失 gen double `var'_datetime = `var' - `offset' if !missing(`var') * 格式化为目标的yyyy-mm-dd hh:mm:ss字符串 gen `var'_formatted = string(`var'_datetime, "%tCY-m-d H:M:S") } * 查看转换结果 list ID Date1_formatted Date2_formatted
注意事项:
- 存储Stata内部时间值的变量必须指定为
double类型,否则会因浮点数精度不足导致时间计算错误 - 可根据数据实际使用的时区调整偏移量的起点时间,避免出现8小时时差
其他工具实现方案
Python(Pandas)
Pandas内置的时间转换函数可直接识别毫秒级Unix时间戳,自动处理缺失值,无需手动计算偏移量:
import pandas as pd import numpy as np # 以下为示例数据构造代码,实际使用时替换为自己的数据读取逻辑 df = pd.DataFrame({ "ID": [1, 2, 3], "Date1": [1.929e+12, 1.917e+12, 1.922e+12], "Date2": [1.929e+12, 1.901e+12, np.nan] }) # 批量转换日期字段 for col in ["Date1", "Date2"]: # 若需转换为北京时间,添加参数utc=True后再转tz_convert("Asia/Shanghai")即可 df[f"{col}_formatted"] = pd.to_datetime(df[col], unit="ms").dt.strftime("%Y-%m-%d %H:%M:%S") # 打印查看结果 print(df[["ID", "Date1_formatted", "Date2_formatted"]])
R
借助lubridate包的时间解析功能即可快速完成转换:
library(lubridate) library(dplyr) # 以下为示例数据构造代码,实际使用时替换为自己的数据读取逻辑 df <- tibble( ID = c(1, 2, 3), Date1 = c(1.929e+12, 1.917e+12, 1.922e+12), Date2 = c(1.929e+12, 1.901e+12, NA) ) # 批量转换日期字段 df <- df %>% mutate(across(c(Date1, Date2), ~format(as_datetime(.x/1000, origin = "1970-01-01", tz = "UTC"), "%Y-%m-%d %H:%M:%S"), .names = "{.col}_formatted")) # 打印查看结果 print(df)
内容的提问来源于stack exchange,提问作者Prajwal Mani Pradhan
相关产品推荐
相关产品推荐

