2016-11-16 140 views
0

轻微的问题,当我将它放在for循环中时,as.Date函数给出了不同的结果。我正在查看包含图像的子文件夹(每日期)的文件夹。我建立date_list来组织所有的日期(在稍后阶段绘制选项)。朱利安节从今年一月一号开始,因为我有4年的日期,年份必须灵活。as.Date函数在for循环中给出了不同的结果

# 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=""))) 

谢谢您的时间!

+1

什么是'folders'?我认为可能有更好的方法来实现你想要的。你应该抛弃'origin'参数中的'as.Date()'调用,'as.Date'函数会根据需要将参数转换为日期,或者如果特定的话,你应该在这里给出一个原点。 – Tensibai

+0

@Tensibai 在文件夹中是在一天后获得的一组卫星图像,然后是52天。在图像的名称是存储日期:LC81730382016267LGN00。这个例子在2016年第267天被捕获。以下: as.Date(day,origin = as.Date(paste(year,jan,sep =“”))) Wil在2016-09- 24,这是我想要的。但它没有成功存储在date_list – Jobbo90

+0

我的意思是'dput文件夹'将有助于帮助你:) – Tensibai

回答

0

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

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

as.Date接受format的说法,(在%Y和%j是在strptime记录)时,%j是儒略日,这是比使用原点和多个粘贴调用更容易阅读。

你的问题实际上是链接到什么Date对象是:

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

当进入一个matrix(您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" 
+0

一天的英雄!谢谢! 答案的第一部分有一句话:在for循环中(通过文件夹映射),这仍然不起作用。它在一个循环之外。但是你的lapply函数效果很好,谢谢。 – Jobbo90

+0

@ Jobbo90事实上,我最初忽略了一部分,我编辑了一个更完整的解释和正确的解决方案。 – Tensibai

0

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

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

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

这可能至少是问题的一部分。在这里提供一个典型的“场景”值的例子。

+0

朱利安天的范围从值1 - 365,所以一天的三个数字。所以我不确定这可能是问题的一部分。 场景是文件夹中图像的名称,它是我使用的itirator。如:'LC81730382016267LGN00' 感谢您的时间! – Jobbo90

+0

啊,它在朱利安时代,我看,我的坏! – user3466328

相关问题