我想生成从公元前 10,000 年到现在的日期序列。这对于 0 CE(或 AD)来说很容易:
ADtoNow <- seq.Date(from = as.Date("0/1/1"), to = Sys.Date(), by = "day")
但我对如何在 0 AD之前生成日期感到困惑。显然,我可以在现在之前做很多年,但如果能够将某些东西绘制成 BCE 和 AD 那就太好了。
为了扩展 Ricardo 的建议,这里有一些关于事情如何运作的测试。或者不要为此工作。
我将?as.Date
用粗体字重复约书亚对未来搜索者的警告:
as.integer(as.Date("0/1/1"))
[1] -719528
as.integer(seq(as.Date("0/1/1"),length=2,by="-10000 years"))
[1] -719528 -4371953
seq(as.Date(-4371953,origin="1970-01-01"),Sys.Date(),by="1000 years")
# nonsense
[1] "0000-01-01" "'000-01-01" "(000-01-01" ")000-01-01" "*000-01-01"
[6] "+000-01-01" ",000-01-01" "-000-01-01" ".000-01-01" "/000-01-01"
[11] "0000-01-01" "1000-01-01" "2000-01-01"
> as.integer(seq(as.Date(-4371953,origin="1970-01-01"),Sys.Date(),by="1000 years"))
# also possibly nonsense
[1] -4371953 -4006710 -3641468 -3276225 -2910983 -2545740 -2180498 -1815255
[9] -1450013 -1084770 -719528 -354285 10957
尽管这似乎确实适用于绘图:
yrs1000 <- seq(as.Date(-4371953,origin="1970-01-01"),Sys.Date(),by="1000 years")
plot(yrs1000,rep(1,length(yrs1000)),axes=FALSE,ann=FALSE)
box()
axis(2)
axis(1,at=yrs1000,labels=c(paste(seq(10000,1000,by=-1000),"BC",sep=""),"0AD","1000AD","2000AD"))
title(xlab="Year",ylab="Value")
自从提出这个问题以来,已经过去了相当长的一段时间。随之而来的是一个新的 R 包gregorian,它可以在方法中处理 BCE 时间值as_gregorian
。
下面是一个分段构建从 -10000 BCE 到当前年份的日期列表的示例。
library(lubridate)
library(gregorian)
# Container for the dates
dates <- c()
starting_year <- year(now())
# Add the CE dates to the list
for (year in starting_year:0){
date <- sprintf("%s-%s-%s", year, "1", "1")
dates <- c(dates, gregorian::as_gregorian(date))
}
starting_year <- "-10000"
# Add the BCE dates to the list
for (year in starting_year:0){
start_date <- gregorian::as_gregorian("-10000-1-1")
date <- sprintf("%s-%s-%s", year, "1", "1")
dates <- c(dates, gregorian::as_gregorian(date))
}
如何使用列表取决于您,只要知道日期对象的相关属性是year
和bce
。例如,您可以遍历日期列表、解析年份并确定它是否为 BCE。
> gregorian_date <- gregorian::as_gregorian("-10000-1-1")
> gregorian_date$bce
[1] TRUE
> gregorian_date$year
[1] 10001
gregorian 包假定当您指的是第 0 年时,您实际上是在谈论第 1 年(如下所示)。我个人认为应该抛出异常,但这是映射用户需要牢记的。
> gregorian::as_gregorian("0-1-1")
[1] "Monday January 1, 1 CE"
BCE也是如此
> gregorian::as_gregorian("-0-1-1")
[1] "Saturday January 1, 1 BCE"
正如@JoshuaUlrich 评论的那样,简短的回答是否定的。
但是,您可以将年份拼接成单独的列,然后转换为整数。这对你有用吗?
该软件包lubridate
似乎可以处理“负”年,尽管它确实创建了 a year 0
,从上述评论来看似乎是不准确的。尝试:
library(lubridate)
start <- -10000
stop <- 2013
myrange <- NULL
for (x in start:stop) {
myrange <- c(myrange,ymd(paste0(x,'-01-01')))
}