10

我想生成从公元前 10,000 年到现在的日期序列。这对于 0 CE(或 AD)来说很容易:

ADtoNow <- seq.Date(from = as.Date("0/1/1"), to = Sys.Date(), by = "day")

但我对如何在 0 AD之前生成日期感到困惑。显然,我可以在现在之前做很多年,但如果能够将某些东西绘制成 BCE 和 AD 那就太好了。

4

4 回答 4

6

为了扩展 Ricardo 的建议,这里有一些关于事情如何运作的测试。或者不要为此工作。

我将?as.Date用粗体字重复约书亚对未来搜索者的警告:

“注意:公元 1 年(又名公元 1 年)之前的几年可能无法正确处理。”

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

在此处输入图像描述

于 2013-02-19T22:23:45.710 回答
2

自从提出这个问题以来,已经过去了相当长的一段时间。随之而来的是一个新的 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))
}

如何使用列表取决于您,只要知道日期对象的相关属性是yearbce。例如,您可以遍历日期列表、解析年份并确定它是否为 BCE。

> gregorian_date <- gregorian::as_gregorian("-10000-1-1")
> gregorian_date$bce
[1] TRUE
> gregorian_date$year
[1] 10001

0AD 注释

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"
于 2020-12-23T23:03:28.710 回答
1

正如@JoshuaUlrich 评论的那样,简短的回答是否定的。

但是,您可以将年份拼接成单独的列,然后转换为整数。这对你有用吗?

于 2013-02-19T22:02:09.170 回答
0

该软件包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')))
}
于 2013-02-19T22:29:49.500 回答