如何将日期从Excel导入Stata

如何将日期从Excel导入Stata,stata,Stata,我用的是Stata12.0 我有一份一年中几天的风险敞口CSV文件,例如2002年11月1日(DMY) 我希望将这些数据导入Stata,并使其识别出它是一个日期变量。我一直在使用: insheet using "FILENAME", comma 但是通过这样做,我只得到了作为标签的日期,而不是变量的名称。我猜这是因为Stata不允许变量名以数字开头。我曾尝试在Excel和import中将单元格重新格式化为日期,但Stata认为整个列都是日期,并将曝光数据更改为日期 任何关于最佳行动方案的建

我用的是Stata12.0

我有一份一年中几天的风险敞口CSV文件,例如2002年11月1日(DMY)

我希望将这些数据导入Stata,并使其识别出它是一个日期变量。我一直在使用:

 insheet using "FILENAME", comma 
但是通过这样做,我只得到了作为标签的日期,而不是变量的名称。我猜这是因为Stata不允许变量名以数字开头。我曾尝试在Excel和import中将单元格重新格式化为日期,但Stata认为整个列都是日期,并将曝光数据更改为日期


任何关于最佳行动方案的建议都将不胜感激

变量可能具有的名称、变量可能具有的值和类型之间似乎存在一些混淆

因此,语句“Stata不允许变量以数字开头”似乎引用了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猜测您的变量名被误读,您可能需要告诉我们更多信息。一个简短而具体的例子比一个较长的口头描述更有价值

变量可能具有的名称、变量可能具有的值和类型之间似乎存在一些混淆

因此,语句“Stata不允许变量以数字开头”似乎引用了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猜测您的变量名被误读,您可能需要告诉我们更多信息。一个简短而具体的例子比一个较长的口头描述更有价值

正如其他地方所评论的,我也认为您可能有一个最好格式化为面板数据的数据集。然而,我首先根据你的问题解决我认为你存在的具体问题。然后我将展示一些代码,以防您对切换到面板结构感兴趣

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

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

运行此命令(在您的情况下,将“
逗号”
替换为“
分隔符(;”)
):

导致

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

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

函数
strtoname()
将用ilegal字符替换
\uuU
。请参阅帮助strotName

现在,如果要使用配电盘结构,一种方法是:

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似乎足够了

注意:我重用了来自的代码


关于性能的进一步说明:一个包含122个变量或天数(列)和10000个观察值或主题(行)+1个标题行的CSV文件,在
重塑后将产生1220000个观察值。我已经在一台旧机器上测试过,它有一个1.79 GHz的AMD处理器和640 MB的RAM,
重塑
大约需要8分钟。Stata 12的硬限值为2147483647个观察值(尽管可用RAM决定您是否能够实际实现),Stata SE的硬限值为32767个变量。

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

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

这里是同一个文件,用文本编辑器打开