as.Date函数在for循环中给出了不同的结果
轻微的问题,当我将它放在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="")))
谢谢您的时间!
嗯,我认为这会回答你的第一个问题:
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"
你的意思是将你的一天输出为3位数字吗?它不应该是2个数字吗?
day <- as.numeric(substr(scene, start=15, stop=16))
或
day <- as.numeric(substr(scene, start=14, stop=15))
这可能至少是问题的一部分。在这里提供一个典型的“场景”值的例子。
朱利安天的范围从值1 - 365,所以一天的三个数字。所以我不确定这可能是问题的一部分。 场景是文件夹中图像的名称,它是我使用的itirator。如:'LC81730382016267LGN00' 感谢您的时间! – Jobbo90
啊,它在朱利安时代,我看,我的坏! – user3466328
什么是'folders'?我认为可能有更好的方法来实现你想要的。你应该抛弃'origin'参数中的'as.Date()'调用,'as.Date'函数会根据需要将参数转换为日期,或者如果特定的话,你应该在这里给出一个原点。 – Tensibai
@Tensibai 在文件夹中是在一天后获得的一组卫星图像,然后是52天。在图像的名称是存储日期:LC81730382016267LGN00。这个例子在2016年第267天被捕获。以下: as.Date(day,origin = as.Date(paste(year,jan,sep =“”))) Wil在2016-09- 24,这是我想要的。但它没有成功存储在date_list – Jobbo90
我的意思是'dput文件夹'将有助于帮助你:) – Tensibai