最近我问过如何将日历周转换为日期列表,并收到了一个非常有用的答案: convert calendar weeks into daily dates
我尝试应用上述方法根据“年 - 月”列创建日期列表。唉,我无法弄清楚如何计算不同月份的不同天数。 我想知道这个包裹是否会“自动”考虑闰年?
示例数据:
df <- data.frame(YearMonth = c("2016 - M02", "2016 - M06"), values = c(28,60))
M02 = 2月,M06 = 6月(M11将指11月等)
期望的结果:
DateList Values
2016-02-01 1
2016-02-02 1
ect
2016-02-28 1
2016-06-01 2
etc
2016-06-30 2
值类似
df$values / days_in_month()
提前感谢一百万 - 真的非常感谢!
答案 0 :(得分:0)
我将解析该行给你。
要查找一个月的最后一天,假设您有GNU日期,则可以执行此操作:
year=2016
month=02
last_day=$(date -d "$year-$month-01 + 1 month - 1 day" +%d)
echo $last_day # => 29 -- oho, a leap year!
然后你可以使用for循环每天打印出来。
答案 1 :(得分:0)
感谢Add a month to a Date的回答6并回答(如何用前导0提取数字)我有一个想法用lubridate解决我自己的问题。它可能不是最优雅的方式,但它有效。
data <- data_frame(mon=c("M11","M02"), year=c("2013","2014"), costs=c(200,300))
第1步:创建月数
的列temp2 <- gregexpr("[0-9]+", data$mon)
data$monN <- as.numeric(unlist(regmatches(data$mon, temp2)))
第2步:从年份和月份数创建一个包含开始日期的列
data$StartDate <- as.Date(paste(as.numeric(data$year), formatC(data$monN, width=2, flag="0") ,"01", sep = "-"))
步骤3:根据startdate
创建一个EndDate列作为该月的最后一天data$EndDate <- data$StartDate
day(data$EndDate) <- days_in_month(data$EndDate)
第4步:应用Apply seq.Date using two dataframe columns的答案创建各月的每日列表
data$id <- c(1:nrow(data))
dataL <- setDT(data)[,list(datelist=seq(StartDate, EndDate, by='1 day'), costs= costs/days_in_month(EndDate)) , by = id]