给数据框 r 分配类 PCICt。

9
我有一大批NetCDF文件,其中包含按月平均的历史天气数据。时间维度单位为“自1600-01-01以来的天数”,使用360天日历。我使用了PCICt软件包,根据360天日历正确格式化了时间维度。我的问题是:
  1. 当我尝试将数据写入数据框或保存到输出文件时,会收到以下错误消息:Error in as.data.frame.default(x[[i]], optional = TRUE) : cannot coerce class ""PCICt"" to a data.frame

  2. 我能从这个PCICt数据中提取年份和月份吗?

非常感谢您的帮助。
#packages used
require("PCICt")
require("RNetCDF")

#dput output assigned to "ex" variable (units "Days since 1600-01-01")
ex <- structure(c(1095, 1125, 1155, 1185, 1215, 1245, 1275, 1305, 1335, 
1365, 1395, 1425), .Dim = 12L)

#used PCICt to correctly format date stamp
cal <- "360_day"
origin <- ("1600-01-01")
seconds.per.day <- 86400
origin.pcict <- as.PCICt(origin,cal)
ex_pcict <- origin.pcict + (ex * seconds.per.day)

#result of PCICt code
> print(ex_pcict)
 [1] "1603-01-16" "1603-02-16" "1603-03-16" "1603-04-16"
 [5] "1603-05-16" "1603-06-16" "1603-07-16" "1603-08-16"
 [9] "1603-09-16" "1603-10-16" "1603-11-16" "1603-12-16"

#class definition
> class(ex_pcict)
[1] "PCICt"

#attempt to write to data.frame and resulting error message
> data.frame(date = ex_pcict)
Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class ""PCICt"" to a data.frame

[SOLVED] 经过一夜的思考,今天早上我来到办公室,并开始尝试类转换,最终得到了一个可以使用的日期类:
ex_char <- as.character.PCICt(ex_pcict)

ex_date <- as.Date(ex_char)

然后我可以将"ex_date"写入数据框并导出为.txt文件。我还使用as.numeric(format(ex_date, "%m")和"%Y"分别提取月份和年份。

1个回答

0

或许回答有点晚了,但是有一种新的方法来处理这个问题。

用于气候数据的CF日历

大多数气候观测和预测数据都使用CF元数据约定进行格式化,使用时间坐标定义来格式化观测/预测的时间戳。您的数据中有很多迹象表明这确实适用于您的数据。现在在CRAN上有一个名为CFtime的软件包。该软件包可以透明地处理所有CF日历:

install.packages("CFtime")
library(CFtime)

# Using your example
cf <- CFtime("days from 1600-01-01", "360_day", 
             c(1095, 1125, 1155, 1185, 1215, 1245, 1275, 1305, 1335, 
               1365, 1395, 1425))

# In a CF-compliant file you would read this straight out of your netCDF file
nc <- nc_open("my_data_file.nc")
cf <- CFtime(nc$dim$time$units, nc$dim$time$calendar, nc$dim$time$vals)

# Make a data.frame of the dates as string
data.frame(date = CFtimestamp(cf))

请注意,这些日期字符串不一定是标准日历上的有效日期(因此与POSIXt和Date类不兼容)。例如,1600-02-30是一个有效日期,而1600-03-31是无效的,使用的是360_day日历。
这适用于CF日历中的任何一个,包括标准日历。这比你使用PCICt软件包的示例更简单明了,只需两行代码即可实现。

为什么POSIXt与CF日历不兼容

CF约定中有九种不同的日历,其中有几种与POSIXt不兼容:365_daynoleap没有闰年,即使是2016年或2020年;在366_dayall_leap日历中,每年都有一个闰日;最后,在360_day日历中,每年有12个每月都是30天的月份。
你的日期没有问题,因为它总是在月中(另一种CF约定),但是对于每日数据,你很快就会遇到问题。使用as.character.PCICt()然后再用as.Date()将给你一个预期的Date向量,但它会缺少某些日期(例如没有1月31日),并且2月29日和30日会有NA值。
再次强调,CFtime软件包可以在不丢失任何数据的情况下处理这些日历。

为什么要费心呢?

在全球气候研究中,通常的兴趣是确定相对于某个基准线的变化。大多数研究使用1850年作为基准年份,目前全球平均气温自那年以来已经升高了约1.3K。考虑到全球平均温度约为287K,我们观察到的相对变化在约170年间为1.3 / 287 = 0.45%。许多研究使用较小的比较时段,例如“与1991-2020年基准期间相比的中21世纪温度”。随意移动一两天(如PCICt所做的)可能会模糊数据中的信号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接