如何比较Stata中的日期?
How to compare dates in Stata?
我在 Stata 中有以下数据集
Id | date1 | date2
------------------------
1 | 28mar2005| 30jun2005
2 | 28mar2005| 31dec2005
3 | 28mar2005| 28febr2005
3 | 28mar2005| 30apr2005
3 | 28mar2005| 31dec2005
第二列的值对于所有观察值都是相同的。所考虑的年份在 date1 和 date2 中是相同的。
date2 中的日期始终是相关月份的最后一天。
date2中的日期不重复,在Id内排序。
在 Id 中,我想保留数据集的观察结果,使得 date1 的 "mm" 和 date2 的 "mm" 之间的 "time distance" 最小。如果 n 个观察结果之间没有差异,我想保留 n 个观察结果中显示的最后一个观察结果。因此,我想得到
Id | date1 | date2
------------------------
1 | 28mar2005| 30jun2005
2 | 28mar2005| 31dec2005
3 | 28mar2005| 30apr2005
我的想法是
(a) 在 date1 和 date2
之间生成一个 "absolute value distance"
(b) 通过Id求最小绝对值距离
(c)如果某个Id被多次列出,保持绝对值距离最小的观察
有什么建议吗?
我有些疑惑。
比如为什么要30apr2005
,如果28feb2005
更接近28mar2005
?
我不太清楚你所说的"In case of indifference between n observations..."是什么意思,所以我随意解释了。我调整了您的示例数据以反映这一点。特别要注意的是,对于 id == 3
,有两个观察结果具有相同的 date1
和 date2
,但 metric
不同。我只有一个。
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)
您也许可以在代码中为自己省去一个 sort
,但如果它不会导致任何明显的速度下降,我会保留它。
%td 日期是整数,其中零是 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
请注意,我添加了最后一行以创建 "indifference" 场景的实例(如果在绝对距离方面存在联系,请保留较晚的日期 2)。
我在 Stata 中有以下数据集
Id | date1 | date2
------------------------
1 | 28mar2005| 30jun2005
2 | 28mar2005| 31dec2005
3 | 28mar2005| 28febr2005
3 | 28mar2005| 30apr2005
3 | 28mar2005| 31dec2005
第二列的值对于所有观察值都是相同的。所考虑的年份在 date1 和 date2 中是相同的。
date2 中的日期始终是相关月份的最后一天。
date2中的日期不重复,在Id内排序。
在 Id 中,我想保留数据集的观察结果,使得 date1 的 "mm" 和 date2 的 "mm" 之间的 "time distance" 最小。如果 n 个观察结果之间没有差异,我想保留 n 个观察结果中显示的最后一个观察结果。因此,我想得到
Id | date1 | date2
------------------------
1 | 28mar2005| 30jun2005
2 | 28mar2005| 31dec2005
3 | 28mar2005| 30apr2005
我的想法是
(a) 在 date1 和 date2
之间生成一个 "absolute value distance"(b) 通过Id求最小绝对值距离
(c)如果某个Id被多次列出,保持绝对值距离最小的观察
有什么建议吗?
我有些疑惑。
比如为什么要30apr2005
,如果28feb2005
更接近28mar2005
?
我不太清楚你所说的"In case of indifference between n observations..."是什么意思,所以我随意解释了。我调整了您的示例数据以反映这一点。特别要注意的是,对于 id == 3
,有两个观察结果具有相同的 date1
和 date2
,但 metric
不同。我只有一个。
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)
您也许可以在代码中为自己省去一个 sort
,但如果它不会导致任何明显的速度下降,我会保留它。
%td 日期是整数,其中零是 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
请注意,我添加了最后一行以创建 "indifference" 场景的实例(如果在绝对距离方面存在联系,请保留较晚的日期 2)。