as.Date函数在for循环中给出不同的结果

时间:2016-11-16 15:58:07

标签: r loops output as.date

当我将as.Date函数放入for循环时,我的as.Date函数会产生不同的结果。我正在查找包含图像的子文件夹(每个日期)的文件夹。我构建date_list来组织所有日期(用于在后期绘制选项)。朱利安日从今年1月1日开始,因为我有4年的约会,这一年必须灵活。

# Set up list with 4 columns and counter Q. jan is used to set all dates to the first of january
date_list <- outer(1:52, 1:4)
q = 1
jan <- "-01-01"

for (scene in folders){
  year <- as.numeric(substr(scene, start=10, stop=13))
  day <- as.numeric(substr(scene, start=14, stop=16))
  datum <- paste(year, day, sep='_')
  date_list[q, 1] <- datum
  date_list[q, 2] <- year
  date_list[q, 3] <- day
  date_list[q, 4] <- as.Date(day, origin = as.Date(paste(year,jan, sep=""))) 
  q = q+1
}

输出最后一行:

[52,] "2016_267" "2016" "267" "17068"

我在date_list [q,4]中缺少什么不能将我的整数转移到日期? 运行以下代码确实有效,但由于我希望自动化大量的场景和文件夹:

 as.Date(day, origin = as.Date(paste(year,jan, sep="")))

感谢您的时间!

2 个答案:

答案 0 :(得分:0)

你的意思是把你的一天输出为3个数字吗?它应该不是2个数字吗?

day <- as.numeric(substr(scene, start=15, stop=16))

day <- as.numeric(substr(scene, start=14, stop=15))

这至少可以成为问题的一部分。提供一个典型的&#34;场景&#34;的例子。在这里会有所帮助。

答案 1 :(得分:0)

好吧,我认为这会回答你的第一个问题:

date_list[q, 4] <- as.character(as.Date(datum,format="%Y_%j"))

as.Date接受format参数,({1}}中记录了%Y和%j),strptime是朱利安日,这有点容易阅读而不是使用原始和多个粘贴调用。

您的问题实际上与%j对象的关联:

Date

当输入> dput(as.Date("2016-01-10")) structure(16810, class = "Date") (您的matrix)时,它会被强制转换为字符w 在此之前没有经过特殊处理:

date_list

因此,您只获得自1970-01-01以来的天数。当您使用> d<-as.Date("2016-01-10") > class(d)<-"character" > d [1] "16810" 要求将日期作为字符表示时,它会提供正确的值,因为as.character类作为Date方法,在返回字符值之前首先以人格式计算日期

现在,如果我理解你的问题,我就会这样:

首先创建一个函数来处理一个字符串:

as.character

这个函数只是得到你的子串,然后将它转换为POSIXlt类,它给我们一次通过julian日,年和日。由于年份自1900年起存储为整数(可能为负数),因此我们必须在字段中存储年份时添加1900。

然后,如果您的name_to_list <- function(name) { dpart <- substr(name, start=10, stop=16) date <- as.POSIXlt(dpart, format="%Y%j") c("datum"=paste(date$year+1900,date$yday,sep="_"), "year"=date$year+1900, "julian_day"=date$yday, "date"=as.character(date) ) } 变量是字符串向量:

folders

lapply(folders,name_to_list) 给出了:

folders=c("LC81730382016267LGN00","LC81730382016287LGN00","LC81730382016167LGN00")