Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中的两个月之间插入月日期_R_Date - Fatal编程技术网

在R中的两个月之间插入月日期

在R中的两个月之间插入月日期,r,date,R,Date,在R中有两个日期,我想在它们之间创建一个日期向量,间隔一个月。然而,R似乎使用了31天的间隔(有时?)。例如: x <- as.Date("31-01-1900", "%d-%m-%Y") y <- as.Date("31-01-1901", "%d-%m-%Y") seq(x, y, by="month") [1] "1900-01-31" "1900-03-03" "1900-03-31" "1900-05-01" "1900-05-31" [6] "1900-07-01"

在R中有两个日期,我想在它们之间创建一个日期向量,间隔一个月。然而,R似乎使用了31天的间隔(有时?)。例如:

x <- as.Date("31-01-1900", "%d-%m-%Y")
y <- as.Date("31-01-1901", "%d-%m-%Y")
seq(x, y, by="month")

 [1] "1900-01-31" "1900-03-03" "1900-03-31" "1900-05-01" "1900-05-31"
 [6] "1900-07-01" "1900-07-31" "1900-08-31" "1900-10-01" "1900-10-31"
[11] "1900-12-01" "1900-12-31" "1901-01-31"

R知道月份的长度吗,还是我必须手工完成?

我们可以使用
lubridate

library(lubridate)
x <- as.Date("31-01-1900", "%d-%m-%Y")
y <- as.Date("31-01-1901", "%d-%m-%Y")
c(x, x %m+% months(1:11), y)

[1] "1900-01-31" "1900-02-28" "1900-03-31" "1900-04-30"
[5] "1900-05-31" "1900-06-30" "1900-07-31" "1900-08-31"
[9] "1900-09-30" "1900-10-31" "1900-11-30" "1900-12-31"
[13] "1901-01-31"

您可以生成每个月第一个的序列,然后减去1

seq(as.Date("1900-02-01"), length = 12, by="1 month") - 1
# [1] "1900-01-31" "1900-02-28" "1900-03-31" "1900-04-30" "1900-05-31" "1900-06-30"
# [7] "1900-07-31" "1900-08-31" "1900-09-30" "1900-10-31" "1900-11-30" "1900-12-31"

## the same can be achieved with `seq.Date()`
# seq.Date(as.Date("1900-02-01"), by = "1 month", length.out = 12) - 1 

您可以查看lubridate的
package,不过这是?seq.POSIXt的一段摘录:“使用“month”首先提前月份,而不更改日期:如果这导致一个月中的某一天无效,则将其向前计算到下一个月。”因此,这些函数中的这一点看起来是固定的。这两个答案都非常好,但我更喜欢这个,因为它不需要包装;我通常会先尝试一个基本的解决方案。
lubridate::add_with_rollback(x, months(0:12))

 [1] "1900-01-31" "1900-02-28" "1900-03-31" "1900-04-30"
 [5] "1900-05-31" "1900-06-30" "1900-07-31" "1900-08-31"
 [9] "1900-09-30" "1900-10-31" "1900-11-30" "1900-12-31"
[13] "1901-01-31"
seq(as.Date("1900-02-01"), length = 12, by="1 month") - 1
# [1] "1900-01-31" "1900-02-28" "1900-03-31" "1900-04-30" "1900-05-31" "1900-06-30"
# [7] "1900-07-31" "1900-08-31" "1900-09-30" "1900-10-31" "1900-11-30" "1900-12-31"

## the same can be achieved with `seq.Date()`
# seq.Date(as.Date("1900-02-01"), by = "1 month", length.out = 12) - 1