我正在使用Stata 12.0。
我有一年中几天的CSV文件曝光,例如01/11/2002(DMY)。
我希望将这些导入到Stata中并识别它是一个日期变量。我一直在用:
insheet using "FILENAME", comma
但通过这样做,我只将日期作为标签而不是变量的名称。我想这是因为Stata不允许变量名以数字开头。我试图将单元格重新格式化为Excel中的日期并导入,但随后Stata认为整个列都是日期并将曝光数据更改为日期。
对于最佳行动方案的任何建议都表示赞赏......
答案 0 :(得分:2)
正如其他地方所评论的,我也认为您可能拥有最佳格式化为面板数据的数据集。但是,我首先根据您的问题解决我认为您遇到的具体问题。然后,我会展示一些代码,以防您有兴趣切换到面板结构。
以下是以电子表格形式打开的示例CSV文件:
这里是同一个文件,在文本编辑器中打开。想象一下;
是,
。这与我系统的语言设置有关。
运行此项(在您的情况下,将delimiter(";")
替换为comma
):
clear all
set more off
insheet using "D:\xlsdates.csv", delimiter(";")
结果
我认为是您描述的问题:日期为变量标签。您希望将日期设为变量名称。一种解决方案是根据变量标签使用循环和strtoname()
到rename
变量。使用insheet
导入后,将执行以下操作:
foreach var of varlist * {
local j = "`: variable l `var''"
local newname = strtoname("`j'", 1)
rename `var' `newname'
}
结果是
函数strtoname()
将替换_
的非法字符。请参阅help strtoname
。
现在,如果你想使用面板结构,一种方法是:
clear all
set more off
insheet using "D:\xlsdates.csv", delimiter(";")
* Rename variables
foreach var of varlist * {
local j = "`: variable l `var''"
local newname = strtoname("`j'", 1)
rename `var' `newname'
}
* Generate ID
generate id = _n
* Change to long format
reshape long _, i(id) j(dat) string
* Sensible name
rename _ metric
* Generate new date variable
gen dat2 = date(dat,"DMY", 2050)
format dat2 %d
list, sepby(id)
如您所见,事先无需在Excel或编辑器中执行任何操作。在这种情况下,Stata似乎已经足够了。
注意:我重用了http://www.stata.com/statalist/archive/2008-09/msg01316.html中的代码。
关于效果的进一步说明:包含122个变量或天数(列)和10,000个观察值或主题(行)+ 1个标题行的CSV文件将在{{1}之后生成1,220,000个观察值}。我在一台配备1.79 GHz AMD处理器和640 MB RAM的旧机器上进行了测试,reshape
大约需要8分钟。 Stata 12的硬限制为2,147,483,647次观测(尽管可用的RAM确定您是否可以实现它)和Stata SE的32,767次变量。
答案 1 :(得分:1)
变量可能具有的名称,变量可能具有的值以及类型之间似乎存在一些混淆可能有。
因此,声明" Stata不允许变量以数字开头#34;似乎是对Stata的变量名称规则的引用;如果是真的,那么数字变量是不可能的。
Stata没有日期的变量(即存储)类型。严格来说,它没有日期变量的概念,但日期可以保存为字符串或数字。日期可以保持为字符串,只要指示日期的任何文本可能是Stata可以容纳的字符串。这很灵活,但不是特别有用。对于几乎所有有用的工作,日期需要转换为整数,然后分配一个与其内容相匹配的显示格式,以供人们阅读。 Stata在这里有各种各样的约定,例如每日日期为整数,0表示1960年1月1日。
在您的情况下,似乎可以将每日日期作为字符串导入:如果是,则函数date()
(也称为daily()
)可用于转换为整数日期。此处的示例仅使用每日日期的最小默认显示格式:存在更友好的格式。
. set obs 1
obs was 0, now 1
. gen sdate = "12/03/12"
. gen ndate = daily(sdate, "DMY", 2050)
. format ndate %td
. l
+----------------------+
| sdate ndate |
|----------------------|
1. | 12/03/12 12mar2012 |
+----------------------+
如果您的变量名被误读,正如@ChrisP所猜测的那样,您可能需要告诉我们更多信息。一个简短而具体的例子比一个更长的口头描述更有价值。