【问题标题】:Error reading timestamps using "xlsx" package使用“xlsx”包读取时间戳时出错
【发布时间】:2015-08-10 10:23:52
【问题描述】:

Excel 文件中的数据如下所示

TIMESTAMP           TYPE BID BIDSIZ
2015-01-04 09:00:00 BID 365    10
2015-04-01 09:00:05 BID 367.8  55
2015-04-01 09:00:33 BID 365    10
2015-04-01 09:00:36 BID 367.8  55

当我运行以下代码时:

require(xlsx)
f1<-read.xlsx2("Canara_Data.xlsx", sheetName = "BID")
f1$TIMESTAMP<-as.POSIXct(f1$TIMESTAMP, format="%Y-%M-%D %H:%M:S")

查看它会导致 TIMESTAMP 看起来像

View(`f1`)

TIMESTAMP   X.  BID BIDSIZ
42008.375   BID 365 10
42095.37505787037   BID 367.8   55
42095.37538194445   BID 365 10
42095.37541666667   BID 367.8   55

str(f1)
# 'data.frame': 18214 obs. of  4 variables:
#  $ TIMESTAMP: POSIXct, format: NA NA ...
#  $ TYPE   : Factor w/ 1 level "BID": 1 1 1 1 1 1 1 1 1 1 ...
#  $ BID    : Factor w/ 344 levels "365","365.1",..: 1 55 1 55 1 55 1 55 59 1 ...
#  $ BIDSIZ : Factor w/ 1259 levels "1","10","100",..: 2 854 2 854 2 854 2 854 4 2

请帮助将 TIMESTAMP 读取为格式为“%Y-%M-%D %H:%M:S”的日期,并将 BID 和 BIDSIZ 读取为字符。

【问题讨论】:

  • 试试 readxl 包
  • @hadley 你投反对票了吗? (我怀疑你这样做了,因为否决票的时间戳和你的评论大约是同时的)如果是这样,你能解释一下原因吗?答案有效。
  • @hadley..非常感谢您提供有关 readxl 包的信息。这太棒了。这是最近的一个包。所以,我没有太多关于这个包的信息。

标签: r time-series xlsx posixct


【解决方案1】:

Excel 和日期格式通常不是很好的组合。您可以使用:

f1$TIMESTAMP <- as.POSIXct(f1$TIMESTAMP*86400, origin="1899-12-30",tz="GMT")

将其转换为数据时间格式。

这给出了:

> f1
            TIMESTAMP  X.   BID BIDSIZ
1 2015-01-04 09:00:00 BID 365.0     10
2 2015-04-01 09:00:05 BID 367.8     55
3 2015-04-01 09:00:33 BID 365.0     10
4 2015-04-01 09:00:36 BID 367.8     55

另一种解决方案是将您的 excel 文件导出到 .csv 或制表符分隔的 .txt 文件,然后将其读入 R。

您可以将BIDBIDSIZ 列转换为字符列:

f1[,c(3:4)] <- lapply(f1[,c(3:4)], as.character)

使用过的数据:

f1 <- structure(list(TIMESTAMP = c(42008.375, 42095.3750578704, 42095.3753819444, 42095.3754166667),
                     X. = structure(c(1L, 1L, 1L, 1L), .Label = "BID", class = "factor"), 
                     BID = c(365, 367.8, 365, 367.8),
                     BIDSIZ = c(10L, 55L, 10L, 55L)),
                .Names = c("TIMESTAMP", "X.", "BID", "BIDSIZ"), class = "data.frame", row.names = c(NA, -4L))

【讨论】:

  • 亲爱的,它显示了 - Ops.POSIXt(f1$TIMESTAMP, 86400) 中的错误:'*' not defined for "POSIXt" objects
  • @gauravkumar 它可以在我的系统(OSX 上的 R3.2.1)上使用您提供的数据。您是否使用了完全相同的命令?你还能显示你的sessionInfo()吗?
  • 亲爱的..这是一个巨大的数据..大约 15000 个数据点。这不适合结构。
  • Sessionnfo()R 版本 3.1.2 (2014-10-31) 平台:x86_64-w64-mingw32/x64(64 位)语言环境:[1] LC_COLLATE=English_United States.1252 LC_CTYPE= English_United States.1252 [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C [5] LC_TIME=English_United States.1252 附加的基本包:[1] 统计图形 grDevices 实用程序数据集方法基于其他附加包:[1] timeDate_3012.100 xlsx_0 .5.7 xlsxjars_0.6.1 rJava_0.9-7 [5] highfrequency_0.4 xts_0.9-7 zoo_1.7-12
  • @gauravkumar 你也可以dput(head(f1,10)) (并将其添加到你的问题中,而不是在 cmets 中)
【解决方案2】:

使用包readxl

excel_sheets("C:\\Users\\Gaurav Kumar\\Documents\\Canara_Data.xlsx")
grv<-read_excel("C:\\Users\\Gaurav Kumar\\Documents\\Canara_Data.xlsx", sheet = 1, col_names = TRUE, col_types = NULL, na = "", skip = 0)

它也会读取时间戳。将 excel 转换为 csv 可以节省大量时间,因为知道 CSV 在保存时间戳方面存在问题。

              TIMESTAMP EX  BID BIDSIZ
1   2015-04-01 09:00:00 N   365.00  10
2   2015-04-01 09:00:05 N   367.80  55
3   2015-04-01 09:00:33 N   365.00  10
4   2015-04-01 09:00:36 N   367.80  55
5   2015-04-01 09:00:41 N   365.00  10
6   2015-04-01 09:00:41 N   367.80  55

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2014-01-31
    • 2016-12-05
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2017-01-24
    • 2011-11-11
    相关资源
    最近更新 更多