如何根据结束日期和使用R后的月份计算初始日期?

yc0p9oo0  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(196)

我有一个数据集,其中有一个包含结束日期的列(这些日期是时间点2)。例如,这样的日期可以是2023-05-31、2023-05-30、2023-05-29。然后我有另一个列是自上一个时间点以来的月数(自时间点1以来的月数)。例如,14.23、15.28、30.12。
如何在R中计算初始日期(也称为时间点1日期)?
我试着看过去关于堆栈溢出的文章,但大多数都告诉你如何计算两个日期之间的时间,或者仅仅是两天之后的时间。任何帮助是非常感谢!
我尝试使用lubridate和interval,但无法完全找出正确的代码。

w80xi6nr

w80xi6nr1#

十进制的月份有点奇怪,因为它们可能有不同的长度。为了得到近似的TP1,可以使用平均长度30.437

transform(dat, tp1=tp2 - mts*30.437)
#          tp2   mts        tp1
# 1 2023-05-31 14.23 2022-03-23
# 2 2023-05-30 15.28 2022-02-18
# 3 2023-05-29 30.12 2020-11-23
  • 数据:*
dat <- data.frame(tp2=c('2023-05-31', '2023-05-30', '2023-05-29'),
                  mts=c(14.23, 15.28, 30.12))
dat$tp2 <- as.Date(dat$tp2)
hec6srdp

hec6srdp2#

在@jay.sf的解决方案上使用tidyverse构建。

# build dates data frame
dates <-  
  data.frame(
    date = c('2022-01-01', '2022-02-01', '2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01', 
             '2022-07-01', '2022-08-01', '2022-09-01', '2022-10-01', '2022-11-01', '2022-12-01')
  )

# calculate average number of days per month in 2022 (different than leap years)
avg_days <-
  dates |> 
  dplyr::mutate(days = lubridate::days_in_month(lubridate::ymd(date))) |> 
  dplyr::summarize(avg = mean(days)) |> 
  dplyr::pull()

# your data
df <-
  data.frame(
    end_date = c('2023-05-31', '2023-05-30', '2023-05-29'),
    months_since = c(14.23, 15.28, 30.12)
  )

# calculate start date
df |> 
  dplyr::mutate(
    end_date = lubridate::ymd(end_date),
    start_date = end_date - (months_since*avg_days)
  )
#>     end_date months_since start_date
#> 1 2023-05-31        14.23 2022-03-24
#> 2 2023-05-30        15.28 2022-02-19
#> 3 2023-05-29        30.12 2020-11-23

创建于2023-05-31带有reprex v2.0.2

相关问题