如何将日期从Excel导入Stata

时间:2013-11-28 16:24:57

标签: stata

我正在使用Stata 12.0。

我有一年中几天的CSV文件曝光,例如01/11/2002(DMY)。

我希望将这些导入到Stata中并识别它是一个日期变量。我一直在用:

 insheet using "FILENAME", comma 

但通过这样做,我只将日期作为标签而不是变量的名称。我想这是因为Stata不允许变量名以数字开头。我试图将单元格重新格式化为Excel中的日期并导入,但随后Stata认为整个列都是日期并将曝光数据更改为日期。

对于最佳行动方案的任何建议都表示赞赏......

2 个答案:

答案 0 :(得分:2)

正如其他地方所评论的,我也认为您可能拥有最佳格式化为面板数据的数据集。但是,我首先根据您的问题解决我认为您遇到的具体问题。然后,我会展示一些代码,以防您有兴趣切换到面板结构。

以下是以电子表格形式打开的示例CSV文件:

csv file in spreadsheet

这里是同一个文件,在文本编辑器中打开。想象一下;,。这与我系统的语言设置有关。

csv file in text editor

运行此项(在您的情况下,将delimiter(";")替换为comma):

clear all
set more off
insheet using "D:\xlsdates.csv", delimiter(";")

结果

problem

我认为是您描述的问题:日期为变量标签。您希望将日期设为变量名称。一种解决方案是根据变量标签使用循环和strtoname()rename变量。使用insheet导入后,将执行以下操作:

foreach var of varlist * {
    local j = "`: variable l `var''"
    local newname = strtoname("`j'", 1)
    rename `var' `newname'
}

结果是

renamed variables

函数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所猜测的那样,您可能需要告诉我们更多信息。一个简短而具体的例子比一个更长的口头描述更有价值。