Stata中基于日期变量筛选数据及统计指定周/月工人数的方法咨询
解决Stata中按指定周/月统计工人数量的问题
我来帮你搞定这个Stata日期筛选的问题~你之前遇到的06jan2018 invalid name错误,核心原因是:Stata里的日期变量虽然显示为文本格式(比如06jan2018、Jan2018),但底层是存储为数值的,直接用显示的文本值去做匹配,Stata会把它当成变量名,自然就报错了。下面给你两种场景的正确操作方法:
一、按指定周筛选并统计工人数量
你的week变量是%td(日日期)格式,存储的是从1960年1月1日开始的天数(比如21211对应06jan2018)。正确的筛选方式是把你要匹配的日期文本转换成Stata能识别的日日期数值,推荐用date()函数:
完整代码示例
preserve // 把"06jan2018"转换成Stata日日期数值,和week变量的存储值匹配 keep if week == date("06jan2018", "DMY") // 统计该周的unique工人数量 distinct union_workers restore
补充说明
date("06jan2018", "DMY")里的DMY表示日期字符串的格式是“日-月-年”,如果你的日期字符串格式不同,可以调整参数(比如MDY对应“月-日-年”)。- 你也可以直接用数值匹配(比如
week == 21211),但这种方式不直观,后期维护代码时容易搞混日期,更推荐用date()函数的写法。
二、按指定月筛选并统计工人数量
你的month变量是%tmMonYY(月日期)格式,存储的是从1960年1月开始的月份数(比如696对应Jan2018)。推荐用monthly()函数来转换文本日期,写法更直观:
完整代码示例
preserve // 把"Jan2018"转换成Stata月日期数值,和month变量的存储值匹配 keep if month == monthly("Jan2018", "MY") // 统计该月的unique工人数量 distinct union_workers restore
其他可选写法
如果你习惯用“年-月”的格式,也可以这么写:
keep if month == monthly("2018m1", "YM")
或者用mdy()函数(月-日-年)来转换:
// 1代表1月,1代表当月任意一天,2018是年份 keep if month == mdy(1, 1, 2018)
实用小技巧
- 不确定日期对应的数值?可以用
display命令验证:// 查看06jan2018对应的日日期数值 display date("06jan2018", "DMY") // 查看Jan2018对应的月日期数值 display monthly("Jan2018", "MY") - 如果需要批量处理多个日期,可以把目标日期存在本地宏里,代码更整洁:
local target_week = date("06jan2018", "DMY") preserve keep if week == `target_week` distinct union_workers restore
内容的提问来源于stack exchange,提问作者nesta13




