如何在Stata中比较日期?

如何在Stata中比较日期?,stata,Stata,我在Stata中有以下数据集 Id | date1 | date2 ------------------------ 1 | 28mar2005| 30jun2005 2 | 28mar2005| 31dec2005 3 | 28mar2005| 28febr2005 3 | 28mar2005| 30apr2005 3 | 28mar2005| 31dec2005 第二列的值对于所有观测值都相同。日期1和日期2所考虑的年份相同 date2中的日期始终是相对月份的最后一天 da

我在Stata中有以下数据集

Id | date1    | date2
------------------------
1  | 28mar2005| 30jun2005
2  | 28mar2005| 31dec2005
3  | 28mar2005| 28febr2005
3  | 28mar2005| 30apr2005
3  | 28mar2005| 31dec2005
第二列的值对于所有观测值都相同。日期1和日期2所考虑的年份相同

date2中的日期始终是相对月份的最后一天

date2中的日期不重复,在Id中排序

在Id中,我希望保持数据集的观测值,使date1的“mm”和date2的“mm”之间的“时间距离”最小。如果n个观测值之间无差异,我希望保留n个观测值中显示的最后一个观测值。因此,我想

Id | date1    | date2
------------------------
1  | 28mar2005| 30jun2005
2  | 28mar2005| 31dec2005
3  | 28mar2005| 30apr2005
我的想法是

(a) 在日期1和日期2之间生成“绝对值距离”

(b) 按Id查找最小绝对值距离

(c) 如果某个Id多次列出,则以最小绝对值距离保持观察

有什么建议吗?

我有些怀疑

例如,如果2005年2月28日<代码>与2005年3月28日<代码>更接近,为什么要
2005年4月30日

我不确定你所说的“在n个观测值之间无差异的情况下……”是什么意思,所以我自由地解释了。我调整了您的示例数据以反映这一点。特别要注意的是,对于
id==3
,有两个观测值共享相同的
date1
date2
,但不同的
度量值
。我只留了一个

clear
set more off

*----- example data -----

input ///
id str15(date1 date2)
1   28mar2005 30jun2005
2   28mar2005 31dec2005
3   28mar2005 28febr2005
3   28mar2005 28febr2005
3   28mar2005 30apr2005
3   28mar2005 31dec2005
end

set seed 128345
gen metric = floor(runiform()*100)

gen date11 = date(date1, "DMY")
gen date22 = date(date2, "DMY")

format %td date??

drop date?
list, sepby(id)

*----- what you want? -----

gen diff = abs(date11 - date22)

bysort id : gen obs = _n
bysort id (diff obs) : keep if diff == diff[1] 
by id: keep if _n == _N

list, sepby(id)

您可以在代码中保存一个
排序
,但如果它不会导致任何明显的速度减慢,我会保留它。

%td日期是整数,其中0是01/01/1960。这意味着减法将为您提供它们之间的天数:

clear 
input Id  str9 date1 str9 date2
1   28mar2005 30jun2005
2   28mar2005 31dec2005
3   28mar2005 28feb2005
3   28mar2005 30apr2005
3   28mar2005 31dec2005
3   27mar2005 27feb2005
end

gen DATE1 =date(date1,"DMY")
gen DATE2 =date(date2,"DMY")
format DATE? %td
drop date1 date2
rename DATE?, lower

gen diff = abs(date1-date2)
gsort Id diff -date2
bys Id: keep if _n==1

list, clean noobs

注意,我添加了最后一行以创建“无差别”场景的实例(如果绝对距离方面存在联系,则保留后面的日期2)

str9
在这里造成了问题,因为观测#3有10个字符表示
date2
@RobertoFerrer修复了!谢谢