前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Stata | 字符串转日期变量

Stata | 字符串转日期变量

作者头像
PyStaData
发布2021-03-06 22:36:38
12.2K0
发布2021-03-06 22:36:38
举报
文章被收录于专栏:PyStaDataPyStaDataPyStaData

转换逻辑

Stata 将日期、时间以及日期和时间以 1960-01-01 00:00:00.000 为开始时间的整数存储。比如1960-01-01 为 0,1959-12-31 为 -1 , 1960-01-02 为 1 。

据此,字符串转换为日期变量的逻辑为:

  • 将待转换字符串(如1960-01-01)通过日期函数转换为 Stata 能够理解的整数并储存在新变量中;
  • 为新变量设置显示格式,注意这里只是修改成便于阅读的显示格式,Stata 储存的仍是整数。
* 生成示例数据
clear
set obs 30
gen date = ""
forvalues i = 1/30{
	dis `i'
	if `i' < 10{
		replace date = "1960-01-" + "0" + "`i'" in `i'
	}
	else{
		replace date = "1960-01-" + "`i'" in `i'
	}
}

* 转换为日期格式
generate date1 = date(date, "YMD")
gen date2 = date1
format date2 %td

日期显示格式(%t formats):

格式

基准

单位

备注

转换函数

%tc

01jan1960

milliseconds

忽略闰秒

clock(string, mask)

%tC

01jan1960

milliseconds

算闰秒

Clock(string,mask)

%td

01jan1960

days

日历日期格式

date(string,mask)

%tw

1960-w1

weeks

第 52 周可能超过 7 天

weekly(string, mask)

%tm

jan1960

months

日历月格式

monthly(string,mask)

%tq

1960-q1

quarters

财务季度

quarterly(string, mask)

%th

1960-h1

half-years

1 个半年= 2 个季度

halfyearly(string, mask)

%ty

0 A.D

year

1960 年是 1960 年

yearly(string,mask)

%tb

-

days

用户自定义

-

上表的转换函数中,string 表示待转换的字符串,mask 指定日期(和|或)时间的组成部分在字符串中出现的顺序。例如,%td函数date()中的掩码由字母 M ,D 和 Y 组成,date("2021-03-03","YMD") 表示将按照年月日显示。

提取日期元素

当把字符变量转换成 Stata 可以识别的整数后,有一系列函数可以在此返回日期信息,比如提取年份、月份、日期、季度,还可以返回日期是一周内的第几天、一年内的第几天等。这类函数有:

函数

用途

year(date)

年份;如:1980, 2002

month(date)

月份;如 1, 2, . . . , 12

day(date)

日期;1, 2, . . . , 31

halfyear(date)

前半年还是后半年; 1 or 2

quarter(date)

提取季度;1, 2, 3, or 4

week(date)

一年为第几周;1, 2, . . . , 52

dow(date)

一周内第几天; 0, 1, . . . , 6; 0 = Sunday

doy(date)

一年内第几天; 1, 2, . . . , 366

clear
input str20 var1
"2021-01-01"
"2021-04-02"
"2021-07-01"
"2021-10-01"
end

generate date1 = date(var1, "YMD")
gen year = year(date1) // 年份
gen month = month(date1) //月份
gen quarter = quarter(date1) //季度
gen halfyear = halfyear(date1) //半年
gen doy = doy(date1) // 一年内第几天

筛选日期

* 生成示例数据
clear
set obs 30
gen date = ""
forvalues i = 1/30{
	dis `i'
	if `i' < 10{
		replace date = "1960-01-" + "0" + "`i'" in `i'
	}
	else{
		replace date = "1960-01-" + "`i'" in `i'
	}
}

generate date1 = date(date, "YMD")
format date1 %td

* 保留 1960-01-15 后
keep if date1 > date("1960-01-15","YMD")

日期和时间的转换

gen date3 = cofd(date2) //cofd() 日期转时间
format date3 %tc
gen date4 = dofc(date3) //时间转日期
format date4 %td
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PyStaData 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 转换逻辑
  • 提取日期元素
  • 筛选日期
  • 日期和时间的转换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档