将年月字符串转换为每日日期

时间:2016-02-03 17:50:08

标签: date

最近我问过如何将日历周转换为日期列表,并收到了一个非常有用的答案: 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()

提前感谢一百万 - 真的非常感谢!

2 个答案:

答案 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]