如何将一个计算某个时间点以来月数的数值型变量转换为一个带有可解释日期(R)的变量?[duplicate]

wh6knrhe  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(88)
    • 此问题在此处已有答案**:

Add a month to a Date [duplicate](8个答案)
昨天关门了。
我在R中有一个数据,它有一个数字变量,用来计算自1960年1月以来的月份数。
让我们说:

months_since_1960 <- c(0, 1, 12, 13, 24, 25)

我怎样才能创建一个新的日期变量,以一种有价值的方式向我显示这些日期?我希望这样:

date <- (1960-01,1960-02,1961-01,1961-02,1962-01,1962-02)

我相信这是一个简单的解决办法,但我已经尝试确定这一点,我似乎不能弄清楚...

sgtfey8w

sgtfey8w1#

是这样吗?

library(lubridate)
months_since_1960 <- c(0, 1, 12, 13, 24, 25)
date_ref = as.Date("1960-01-01")
date_ref %m+% months(months_since_1960)
niwlg2el

niwlg2el2#

1)yearmon首先创建一个yearmon变量,它在内部用年份+分数来表示日期,其中12个月的分数为0,1/12,...,11/12。然后我们可以使用它或转换为Date,给出几种可能性。

library(zoo)
months_since_1960 <- c(0, 1, 12, 13, 24, 25)

ym <- as.yearmon(1960) + months_since_1960 / 12

ym # year and month
## [1] "Jan 1960" "Feb 1960" "Jan 1961" "Feb 1961" "Jan 1962" "Feb 1962"

as.Date(ym) # first of month
## [1] "1960-01-01" "1960-02-01" "1961-01-01" "1961-02-01" "1962-01-01" "1962-02-01"

as.Date(ym, frac = 1) # last of month
## [1] "1960-01-31" "1960-02-29" "1961-01-31" "1961-02-28" "1962-01-31" "1962-02-28"

2)Base R使用Base R(无软件包),我们可以这样做以获取每月的第一天:

dat <- months_since_1960 |>
  lapply(\(x) tail(seq(as.Date("1960-01-01"), length = x+1, by = "month"), 1)) |>
  do.call(what = "c")
dat
## [1] "1960-01-01" "1960-02-01" "1961-01-01" "1961-02-01" "1962-01-01" "1962-02-01"

或上月末

as.Date(cut(dat + 31, "month")) - 1
## [1] "1960-01-31" "1960-02-29" "1961-01-31" "1961-02-28" "1962-01-31" "1962-02-28"

**2a)**或者,如果需要,我们可以使用相同的转换来获得月末:

dat2 <- as.Date(ISOdate(1960 + (months_since_1960 %/% 12), months_since_1960 %% 12 + 1, 1))
dat2 
## [1] "1960-01-01" "1960-02-01" "1961-01-01" "1961-02-01" "1962-01-01" "1962-02-01"

相关问题