0

当我将 as.Date 函数放入 for 循环时,我的 as.Date 函数会给出不同的结果。我正在查看包含图像的子文件夹(按日期)的文件夹。我构建 date_list 来组织所有日期(用于在稍后阶段绘制选项)。儒略日从一年的一月一日开始,所以因为我有 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="")))

感谢您的时间!

4

2 回答 2

0

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

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

as.Date接受一个format参数,(%Y 和 %j 记录在 中strptime),这%j是朱利安日,这比使用 origin 和多个粘贴调用更容易阅读。

您的问题实际上与Date对象有关:

> dput(as.Date("2016-01-10"))
structure(16810, class = "Date")

当输入 a matrix(your date_list) 时,它会被强制转换为字符 w 而不进行特殊处理,如下所示:

> d<-as.Date("2016-01-10")
> class(d)<-"character"
> d
[1] "16810"

因此,您只能获得自 1970-01-01 以来的天数。当您要求将日期作为字符表示时as.character,它会给出正确的值,因为Date该类作为一种as.character方法,在返回字符值之前首先以人类格式计算日期。


现在,如果我很好地理解了您的问题,我会这样做:

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

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) )
}

这个函数只是获取您的子字符串,然后将其转换为 POSIXlt 类,它一次性为我们提供了朱利安日、年和日期。由于年份自 1900 年以来存储为整数(可能为负数),因此我们必须在字段中存储年份时添加 1900。

然后,如果您的folders变量是字符串向量:

lapply(folders,name_to_list)

至尊folders=c("LC81730382016267LGN00","LC81730382016287LGN00","LC81730382016167LGN00")给出:

[[1]]
       datum         year   julian_day         date 
  "2016_266"       "2016"        "266" "2016-09-23" 

[[2]]
       datum         year   julian_day         date 
  "2016_286"       "2016"        "286" "2016-10-13" 

[[3]]
       datum         year   julian_day         date 
  "2016_166"       "2016"        "166" "2016-06-15" 
于 2016-11-17T09:11:40.260 回答
0

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

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

或者

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

这至少可能是问题的一部分。在这里提供一个“场景”的典型值的示例会很有帮助。

于 2016-11-16T19:01:10.453 回答