首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串转换为HRF月日期

将字符串转换为HRF月日期
EN

Stack Overflow用户
提问于 2019-03-19 23:39:49
回答 2查看 153关注 0票数 0

我将reshaped作为变量名从Excel导入到表示日期的一系列字符串(5s)“观测”中。

这些日期(存储在变量daate中)的表单是ddnn20Y1108,意思是2008年1月1日;1912,意思是2012年9月1日;11210,意思是2010年12月1日。也就是说,它们是而不是 Stata内部表单(SIF)日期,作为字符串保存!

我尝试过比我记忆中更多的东西(即:直接用format daate %tdddnn20YYgen date = date(daate, "DM20Y")格式化)。

我读过help datetime并试图实现HRF-to-SIF Functions (在我的例子中,这应该是第一步),但没有成功。

This other question几乎让我找到了解决方案:首先是destringing daate to int,然后是gen date = mofd(daate); format date %tm;但这是另一种不成功的方法。

示例数据:

代码语言:javascript
复制
* Example generated by -dataex-. To install: ssc install dataex
clear
input str12 isin str5 daate double price
"AEA000201011" "11008" 3.53
"AEA000201011" "11009" 2.44
"AEA000201011" "11010" 2.32
"AEA000201011" "11011" 2.86
"AEA000201011" "11012" 3.28
"AEA000201011" "11013" 4.93
"AEA000201011" "11014"  8.6
"AEA000201011" "11015" 7.75
"AEA000201011" "1108"  5.34
"AEA000201011" "1109"  1.78
"AEA000201011" "1110"  1.61
"AEA000201011" "11108" 2.63
"AEA000201011" "11109"    2
"AEA000201011" "1111"  2.14
"AEA000201011" "11110" 2.43
"AEA000201011" "11111" 2.94
"AEA000201011" "11112" 3.29
"AEA000201011" "11113"    5
"AEA000201011" "11114" 7.97
"AEA000201011" "11115" 7.09
"AEA000201011" "1112"  2.77
"AEA000201011" "1113"  3.01
"AEA000201011" "1114"   6.5
"AEA000201011" "1115"  7.03
"AEA000201011" "11208" 2.55
"AEA000201011" "11209" 1.82
"AEA000201011" "11210"  2.3
"AEA000201011" "11211" 2.85
"AEA000201011" "11212" 2.98
"AEA000201011" "11213"  5.4
"AEA000201011" "11214" 6.66
"AEA000201011" "11215" 6.25
"AEA000201011" "1208"  5.58
"AEA000201011" "1209"  1.48
"AEA000201011" "1210"  1.59
"AEA000201011" "1211"  2.15
"AEA000201011" "1212"  2.91
"AEA000201011" "1213"   3.6
"AEA000201011" "1214"  6.79
"AEA000201011" "1215"  7.18
"AEA000201011" "1308"  5.37
"AEA000201011" "1309"  1.74
"AEA000201011" "1310"  1.66
"AEA000201011" "1311"  2.21
"AEA000201011" "1312"  3.23
"AEA000201011" "1313"  4.01
"AEA000201011" "1314"  7.15
"AEA000201011" "1315"   7.6
"AEA000201011" "1408"  5.41
"AEA000201011" "1409"  1.64
"AEA000201011" "1410"  2.09
"AEA000201011" "1411"  2.52
"AEA000201011" "1412"  3.23
"AEA000201011" "1413"  4.13
"AEA000201011" "1414"  7.36
"AEA000201011" "1415"  6.66
"AEA000201011" "1508"  5.82
"AEA000201011" "1509"  1.56
"AEA000201011" "1510"  1.89
"AEA000201011" "1511"  2.87
"AEA000201011" "1512"  3.31
"AEA000201011" "1513"  4.66
"AEA000201011" "1514"   7.8
"AEA000201011" "1515"  7.36
"AEA000201011" "1608"  5.25
"AEA000201011" "1609"  1.78
"AEA000201011" "1610"  1.63
"AEA000201011" "1611"  2.92
"AEA000201011" "1612"  2.91
"AEA000201011" "1613"  4.95
"AEA000201011" "1614"  8.65
"AEA000201011" "1615"  7.57
"AEA000201011" "1708"   5.2
"AEA000201011" "1709"  1.59
"AEA000201011" "1710"  1.57
"AEA000201011" "1711"  3.13
"AEA000201011" "1712"  3.36
"AEA000201011" "1713"     5
"AEA000201011" "1714"   7.6
"AEA000201011" "1715"  7.55
"AEA000201011" "1808"  5.04
"AEA000201011" "1809"  1.99
"AEA000201011" "1810"  1.65
"AEA000201011" "1811"  3.11
"AEA000201011" "1812"  3.37
"AEA000201011" "1813"  5.33
"AEA000201011" "1814"   8.7
"AEA000201011" "1815"  8.12
"AEA000201011" "1908"   4.1
"AEA000201011" "1909"  1.98
"AEA000201011" "1910"  1.68
"AEA000201011" "1911"  2.98
"AEA000201011" "1912"   3.3
"AEA000201011" "1913"  5.01
"AEA000201011" "1914"  8.11
"AEA000201011" "1915"  7.76
"AEA000701010" "11008" 2.14
"AEA000701010" "11009"  .78
"AEA000701010" "11010"  .67
"AEA000701010" "11011"  .58
end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-20 00:19:59

这一解决方案依赖于首先整理原版,以接近Stata喜欢的内容,从而允许仔细检查。我们不需要您的所有数据示例(但谢谢)。正如@ presented所指出的,这些都是按月计算的日。

代码语言:javascript
复制
* Example generated by -dataex-. To install: ssc install dataex
clear
input str5 daate
"11008"
"11009"
"11010"
"11011"
"11012"
"11013"
"11014"
"11015"
"1108" 
"1109" 
"1110" 
"11108"
"11109"
"1111" 
"11110"
"11111"
"11112"
"11113"
"11114"
"11115"
"1112" 
"1113" 
"1114" 
"1115" 
"11208"
"11209"
"11210"
"11211"
"11212"
"11213"
"11214"
"11215"
"1208" 
"1209" 
"1210" 
"1211" 
"1212" 
"1213" 
"1214" 
"1215" 
"1308" 
"1309" 
"1310" 
"1311" 
"1312" 
"1313" 
"1314" 
"1315" 
"1408" 
"1409" 
"1410" 
"1411" 
"1412" 
"1413" 
"1414" 
"1415" 
"1508" 
"1509" 
"1510" 
"1511" 
"1512" 
"1513" 
"1514" 
"1515" 
"1608" 
"1609" 
"1610" 
"1611" 
"1612" 
"1613" 
"1614" 
"1615" 
"1708" 
"1709" 
"1710" 
"1711" 
"1712" 
"1713" 
"1714" 
"1715" 
"1808" 
"1809" 
"1810" 
"1811" 
"1812" 
"1813" 
"1814" 
"1815" 
"1908" 
"1909" 
"1910" 
"1911" 
"1912" 
"1913" 
"1914" 
"1915" 
end

gen better = substr(daate, 1, 1) + ///
" " + substr(daate, 2, length(daate) - 3) + ///
" 20" + substr(daate, -2, 2) 

gen mdate = mofd(daily(better, "DMY")) 

sort mdate 

format mdate %tm 

gen year = year(daily(better, "DMY")) 

list if year <= 2009 , sepby(year) 

     +------------------------------------+
     | daate      better     mdate   year |
     |------------------------------------|
  1. |  1108    1 1 2008    2008m1   2008 |
  2. |  1208    1 2 2008    2008m2   2008 |
  3. |  1308    1 3 2008    2008m3   2008 |
  4. |  1408    1 4 2008    2008m4   2008 |
  5. |  1508    1 5 2008    2008m5   2008 |
  6. |  1608    1 6 2008    2008m6   2008 |
  7. |  1708    1 7 2008    2008m7   2008 |
  8. |  1808    1 8 2008    2008m8   2008 |
  9. |  1908    1 9 2008    2008m9   2008 |
 10. | 11008   1 10 2008   2008m10   2008 |
 11. | 11108   1 11 2008   2008m11   2008 |
 12. | 11208   1 12 2008   2008m12   2008 |
     |------------------------------------|
 13. |  1109    1 1 2009    2009m1   2009 |
 14. |  1209    1 2 2009    2009m2   2009 |
 15. |  1309    1 3 2009    2009m3   2009 |
 16. |  1409    1 4 2009    2009m4   2009 |
 17. |  1509    1 5 2009    2009m5   2009 |
 18. |  1609    1 6 2009    2009m6   2009 |
 19. |  1709    1 7 2009    2009m7   2009 |
 20. |  1809    1 8 2009    2009m8   2009 |
 21. |  1909    1 9 2009    2009m9   2009 |
 22. | 11009   1 10 2009   2009m10   2009 |
 23. | 11109   1 11 2009   2009m11   2009 |
 24. | 11209   1 12 2009   2009m12   2009 |
     +------------------------------------+
票数 1
EN

Stack Overflow用户

发布于 2019-03-21 19:25:34

字符串到数字日期转换函数(help datetime_translation)不应与日期和时间显示格式(help datetime_display_formats)混淆。

前者有专用的掩码,而不是接受后者的详细代码。在您的示例中,ddnn20Y是一个显示格式详细代码,因此不是date()函数的有效掩码。

用于日期时间转换的掩码需要DMYhms代码的组合。但是,实现依赖于要翻译的可读的表单日期字符串。

例如,以下内容是有效的:

代码语言:javascript
复制
. display date("011008", "DM20Y")
17806

与此相反,下面的情况不是:

代码语言:javascript
复制
. display date("11008", "DM20Y")
.

任何偏离Stata的日期时间转换规范的字符串都应该首先使用内置字符串函数(如@NickCox的答案)来执行任务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55251516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档