首页 > 解决方案 > 在保留显示的同时更改日期的类型和格式

问题描述

我正在尝试在我的数据集中删除类型为 str9 / %9s 的日期变量,该变量的格式为 DDMonYYYY(其中 Mon 是三个字母的月份缩写),我想将其保留为当前形式。

我一直egen newvarname = max(date)在其他数据集上执行日期为类型:int,格式:%td,并且我希望能够将数据集中的日期与日期作为字符串转换为相同的类型和格式,而保留表格,所以我可以执行相同的命令。

标签: datetypesformatstata

解决方案


不建议使用字符串类型的日期。最好将日期变量从字符串转换为数字。

为此,您需要使用与or命令daily()相反的函数(有关后者不恰当的讨论,请参见此问题)。destringencode

例如:

clear
set obs 2

generate date_string = ""
replace date_string = "29Oct2012" in 1
replace date_string = "14Jan2015" in 2

generate date_numeric = daily(date_string, "DMY")
list, abbreviate(20) noobs

  +----------------------------+
  | date_string   date_numeric |
  |----------------------------|
  |   29Oct2012          19295 |
  |   14Jan2015          20102 |
  +----------------------------+

format %tdDDMonCCYY date_numeric
list, abbreviate(20) noobs

  +----------------------------+
  | date_string   date_numeric |
  |----------------------------|
  |   29Oct2012      29Oct2012 |
  |   14Jan2015      14Jan2015 |
  +----------------------------+

然后,您可以egen根据需要使用:

egen date_max = max(date_numeric)
format %tdDDMonCCYY date_max
list, abbreviate(20) noobs

  +----------------------------------------+
  | date_string   date_numeric    date_max |
  |----------------------------------------|
  |   29Oct2012      29Oct2012   14Jan2015 |
  |   14Jan2015      14Jan2015   14Jan2015 |
  +----------------------------------------+

如果您坚持将所有内容都作为字符串,则可以在之后使用以下tostring命令:

tostring date_max date_numeric, replace format("%tdddMonCCYY") force

推荐阅读