场景
下图数据为受访者平均每周加班时长。基于研究目的,需将其换算为小时数。
+------------------+
| id time |
|------------------ |
1. | 1 4小时12分钟 |
2. | 2 5小时3分钟 |
3. | 3 6小时45分钟 |
4. | 4 16小时3分钟 |
+------------------+
思路
将数据中的小时数 和分钟数 分别提取 出来,进而通过公式计算。例如,个体1的加班时长为4+12/60=4.2小时
但如何分别提取小时数和分钟数呢?或许读者会认为用 substr(s,n1,n2)不就行了吗?
真的是这样吗?笔者注意到,部分个体的小时数只有个位,而有的个体的小时数却有两位数,那么参数n2是输入2,还是4呢?显然,简单地使用substr()达不到目的。
如下为笔者的尝试
clear
input str5 id str20 time
1 4小时12分钟
2 5小时3分钟
3 6小时45分钟
4 16小时3分钟
end
gen time1 = subinstr(time,"分钟","",.)
list id time time1
+----------------------------+
| id time time1 |
|----------------------------|
1. | 1 4小时12分钟 4小时12 |
2. | 2 5小时3分钟 5小时3 |
3. | 3 6小时45分钟 6小时45 |
4. | 4 16小时3分钟 16小时3 |
+----------------------------+
egen hour = ends(time1),punct("小") //提取字符“小”之前的字符
list id time time1 hour
+-----------------------------------+
| id time time1 hour |
|-----------------------------------|
1. | 1 4小时12分钟 4小时12 4 |
2. | 2 5小时3分钟 5小时3 5 |
3. | 3 6小时45分钟 6小时45 6 |
4. | 4 16小时3分钟 16小时3 16 |
+-----------------------------------+
egen minute = ends(time1),punct("时") last //提取字符“时”之后的字符
list id time time1 hour minute
+--------------------------------------------+
| id time time1 hour minute |
|--------------------------------------------|
1. | 1 4小时12分钟 4小时12 4 12 |
2. | 2 5小时3分钟 5小时3 5 3 |
3. | 3 6小时45分钟 6小时45 6 45 |
4. | 4 16小时3分钟 16小时3 16 3 |
+--------------------------------------------+
destring hour ,gen(hour1) float force //转换变量类型
destring minute ,gen(minute1) float force
gen overtime = hour1+minute1/60
list id time time1 hour minute overtime
+-------------------------------------------------------+
| id time time1 hour minute overtime |
|-------------------------------------------------------|
1. | 1 4小时12分钟 4小时12 4 12 4.2 |
2. | 2 5小时3分钟 5小时3 5 3 5.05 |
3. | 3 6小时45分钟 6小时45 6 45 6.75 |
4. | 4 16小时3分钟 16小时3 16 3 16.05 |
+-------------------------------------------------------+
这是笔者在实践中遇到的问题,如果您有更好的解决方案,欢迎在下方留言。
最后编辑于 :2020.04.30 14:32:22
©著作权归作者所有,转载或内容合作请联系作者 平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。