You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Stata中基于日期变量筛选数据及统计指定周/月工人数的方法咨询

解决Stata中按指定周/月统计工人数量的问题

我来帮你搞定这个Stata日期筛选的问题~你之前遇到的06jan2018 invalid name错误,核心原因是:Stata里的日期变量虽然显示为文本格式(比如06jan2018Jan2018),但底层是存储为数值的,直接用显示的文本值去做匹配,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

火山引擎 最新活动