我有一个带有日期变量的[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]用户的任何指导。
答案 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
- 包中的参数xts
。 frac
是介于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