无法在 R 中将序列号日期转换为日期格式

Unable to convert serial number date to Date format in R

提问人:jamberhee 提问时间:6/15/2023 更新时间:6/16/2023 访问量:51

问:

我正在处理一个有点混乱的日期数据集。

参与者在 3-4 年的时间里基本上完成了 1-10 次不同的测试。例如,一个参与者可能在 2005-09-29 完成了 1 个测试。另一位参与者可能已经完成了 7 项测试——2006 年 8 月 30 日完成 2 项,2004 年 3 月 16 日完成 1 项测试,2007 年 4 月 26 日完成 4 项测试。我有大约 3000 名参与者,每个人都有一排。每列代表不同类型的测试。列中的值是参与者完成特定测试的日期。

我正在尝试确定每个参与者测试的“平均”日期。我使用以下代码成功识别了每个参与者测试的“最大”日期:

qstdates$max_date <- apply(qstdates, 1, function(x) max_(c(x[2:11])))
qstdates$max_date <- as.Date(qstdates$max_date)

其中 QstDates 是我的数据集,第 2-11 列代表 10 个可能的测试。

我基本上试图采用相同的代码并对其进行轻微修改,以找到每个参与者的平均日期(每行的平均值)。我尝试了几种方法:

qstdates$avg_date <- apply(sapply(qstdates[2:11], as.numeric), 1, function(x) round(mean_(c(x[2:11]))))
qstdates$avg_date <- sapply(qstdates$avg_date, as.Date, origin="1970-01-01")
##OR
qstdates$avg_date <- round(rowMeans(sapply(qstdates[2:11], as.numeric),na.rm=T))
qstdates$avg_date <- sapply(qstdates$avg_date, as.Date, origin="1970-01-01")

但无论出于何种原因,序列号日期都不会转换为日期格式。当我运行代码时,代码运行,值要么变为负数,要么根本不改变! 序列号日期范围为 12719-15460。

我可能做错了什么?

r datetime 均值 日期转换

评论

0赞 Seth 6/15/2023
一组考试日期的含义是什么?既然您是从确定最大日期开始的,那么它实际上是从第一个日期到最后一个日期的间隔的中点吗?
0赞 jamberhee 6/15/2023
@Seth 这并不完全是从第一个日期到最后一个日期的间隔的中点。对于某些参与者,他们在一个访问日进行了 5 次测试,然后在第二年的单独访问中进行了 2-3 次测试。它因参与者而异。举例来说,如果参与者在周一完成了 5 次测试,然后在周三完成了 1 次测试,在周五完成了 1 次测试,那么我预计这些事件的“平均日期”在周二。我尝试使用“平均值。Date()“函数,但没有运气。我最困惑的是为什么序列日期没有转换为日期。我假设任何数字都可以转换为日期
0赞 nrennie 6/15/2023
如果您添加数据示例,使用它将更容易帮助其他人,因为他们可以运行您的代码。dput()

答:

0赞 jamberhee 6/16/2023 #1

找到了我自己问题的答案!事实证明,我的问题的核心是与这个问题有关。

我能够计算“平均日期”,当我将单个值转换为日期时,它起作用了!出于某种原因,当我尝试将这些单独的日期放入向量中时,我遇到了一个问题。例如:

for(i in 1:length(qstdates$ParticipantID)){
    avg <- qstdates$avg_date[i]
    date <- as.Date(avg,origin="1970-01-01")
    dates <- c(dates,as.character(date))
}

在此代码中,“date”将返回正确格式的日期(“%Y-%M-%D”),class(date)将返回“Date”。但是,“dates”将返回数字格式的序列日期数字向量。class(dates) 将返回“numeric”。

这导致我将我的问题和 stackoverflow 搜索更改为:为什么我不能将单个日期放入“Date”类的向量中?我以前从未遇到过这个问题。我获取了这些信息,并遵循了@mrip为另一个问题提供的推荐解决方法。根据 @mrip 的说法,问题在于 R 不允许用日期填充矩阵。他们的解决方法是使用 class(df)<-c(“matrix”,“Date”) 明确强制我的数据集属于“Date”类和“matrix”类,解决了这个问题!