设置负数到正数的时间

时间:2013-01-31 01:23:57

标签: stata

如果有一个数月的数据集,并且每个人都有不同的月份开始工作。例如:

person         date       date_started      date_count
  Tim        1/1/2000       3/1/2000           -2
  Tim        2/1/2000       3/1/2000           -1
  Tim        3/1/2000       3/1/2000            0
  John       1/1/2000       7/1/2000           -6
  John       2/1/2000       7/1/2000           -5
  John       3/1/2000       7/1/2000           -4
  John       4/1/2000       7/1/2000           -3
  John       5/1/2000       7/1/2000           -2
  John       6/1/2000       7/1/2000           -1
  John       7/1/2000       7/1/2000            0
  John       8/1/2000       7/1/2000            1
  John       9/1/2000       7/1/2000            2
  John      10/1/2000       7/1/2000            3
  Mary       3/1/2000       3/1/2000            0
  Mary       4/1/2000       3/1/2000            1

获取date_count列的最有效方法是什么?我的第一个月的列也是1,否则为0。我宁愿用它来制作date_count

2 个答案:

答案 0 :(得分:1)

我不知道这是否是最佳方式,但我认为它应该有效:

/* convert your dates to Stata's date format from strings */
gen date2=daily(date,"MDY");
gen date_started2=daily(date_started,"MDY");
format date2 date_started2 %td;

/* this is the main code */
gen before = date_started2>date2;
bys person before: egen date_count2 = rank(abs(date_started2 - date2));
replace date_count2 = date_count2 - 1 if before==0;
replace date_count2 = -date_count2 if before==1;
drop before;

修改:

Mea culpa。我完全误解了你的问题意味着你想要每个人观察事件的倒计时开始日期。你真的想要更简单的东西:

  

gen date_count2 = mofd(每日(日期,“MDY”)) - mofd(每日(date_started,“MDY”));

这假设您使用date和date_started作为字符串变量存储。 daily()转换为Stata日期格式,mofd()转换为日历月份。然后就是差异。

答案 1 :(得分:1)

我不明白这里有什么困难。这个问题似乎很难向我解释。

  1. 你提到几个月,但你的例子显示了每日日期,所以几个月在问题中的作用是个谜。

  2. 您想要的变量只是两个每日日期之间的差异。只要你有两个每日日期变量(Dimitriy解释了如何从字符串日期中获取这些变量),它只是一个减法。

  3. (后来补充)我的不确定性表明当人们在国际名单上假定当地公约具有普遍性时会发生什么。有两种惯例很容易混淆,将日期显示为日/月/年,并将日期显示为月/日/年。显然你正在使用第二个约定。如果是这样,问题是使用mofd()从每日日期转换为每月日期;然后如所说它是一个减法。