在[r]数据框中从日期变量创建月末日期的方法

时间:2012-02-29 17:36:00

标签: r date dataframe

我有一个带有日期变量的[r]大数据框,它反映了该月的第一天。是否可以轻松地创建表示该月最后一天的新数据框日期变量?

以下是一些示例数据:

date.start.month=seq(as.Date("2012-01-01"),length=4,by="months")
df=data.frame(date.start.month)
df$date.start.month

"2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01"

我想返回一个新的变量:

"2012-01-31" "2012-02-29" "2012-03-30" "2012-04-27"

我尝试了以下但是没有成功:

df$date.end.month=seq(df$date.start.month,length=1,by="+1 months")

非常感谢对这位新[r]用户的任何指导。

8 个答案:

答案 0 :(得分:26)

要结束月份,您可以创建一个Date向量,其中包含所有后续月份中的第1个月,并减去1天。

date.end.month <- seq(as.Date("2012-02-01"),length=4,by="months")-1
date.end.month
[1] "2012-01-31" "2012-02-29" "2012-03-31" "2012-04-30"

答案 1 :(得分:11)

以下是使用lubridate包的另一种解决方案:

date.start.month=seq(as.Date("2012-01-01"),length=4,by="months")
df=data.frame(date.start.month)

library(lubridate)
df$date.end.month <- ceiling_date(df$date.start.month, "month") - days(1)
df$date.end.month
[1] "2012-01-31" "2012-02-29" "2012-03-31" "2012-04-30"

这使用了James上面给出的相同概念,因为它获得了下个月的第一天并减去了一天。

顺便说一句,即使输入日期不一定是该月的第一天,这也会有效。例如,今天是本月的第27天,它仍然返回正确的月份最后一天:

ceiling_date(Sys.Date(), "month") - days(1)
[1] "2017-07-31"

答案 2 :(得分:9)

使用timeDate包中的timeLastDayInMonth:

try (Session session = ourSessionFactory.openSession()) {
    try {
       tx = session.beginTransaction();
       Person p = new Person(name, affiliation);
       personID = (Integer) session.save(p);
       tx.commit();
    }
    catch (HibernateException e) {
        if (tx != null) {
             tx.rollback();
        }
    }
}

答案 3 :(得分:2)

下面的函数可以完成工作(假设dt是标量) -

month_end <- function(dt) {
    d <- seq(dt, dt+31, by="days")
    max(d[format(d,"%m")==format(dt,"%m")])
}

如果您有日期向量,请执行以下操作 -

sapply(dates, month_end)

答案 4 :(得分:1)

一个简单的解决方案是使用yearmon函数和frac=1 - 包中的参数xtsfrac是介于0和1之间的数字,表示结果所代表的时间段的分数。

as.Date(as.yearmon(seq.Date(as.Date('2017-02-01'),by='month',length.out = 6)),frac=1)

[1] "2017-02-28" "2017-03-31" "2017-04-30" "2017-05-31" "2017-06-30" "2017-07-31"

或者如果您喜欢使用magrittr“管道”:

seq.Date(as.Date('2017-02-01'),by='month',length.out = 6) %>%
         as.yearmon() %>% as.Date(,frac=1)

[1] "2017-02-28" "2017-03-31" "2017-04-30" "2017-05-31" "2017-06-30" "2017-07-31"

答案 5 :(得分:1)

Int?

library(lubridate)
 as.Date("2019-09-01") - days(1)
[1] "2019-08-31"

答案 6 :(得分:0)

您可以使用timeperiodsR

date.start.month=seq(as.Date("2012-01-01"),length=4,by="months")
df=data.frame(date.start.month)
df$date.start.month
# install.packages("timeperiodsR") 

pm <- previous_month(df$date.start.month[1]) # get previous month

start(pm) # first day of previous month
end(pm)   # last day of previous month
seq(pm)   # vector with all days of previous month

答案 7 :(得分:0)

我们也可以使用bsts::LastDayInMonth

transform(df, date.end.month = bsts::LastDayInMonth(df$date.start.month))

#   date.start.month date.end.month
# 1       2012-01-01     2012-01-31
# 2       2012-02-01     2012-02-29
# 3       2012-03-01     2012-03-31
# 4       2012-04-01     2012-04-30