【问题标题】:Reading csv with date and time读取带有日期和时间的csv
【发布时间】:2012-03-11 10:44:44
【问题描述】:

我正在使用 R 并阅读第一列中包含日期和时间的 csv。 我想先在 R 中导入这个 csv 文件,然后将其转换为 zoo obect。

我正在使用 R 中的代码

EURUSD <- as.xts(read.zoo("myfile.csv",sep=",",tz="",header=T))

我的 csv 文件包含以下格式的数据:

Date,Open,Low,High,Close
2006-01-02 10:01:00,2822.9,2825.45,2822.1,2824.9
2006-01-02 10:02:00,2825,2825.9,2824,2824.95
2006-01-02 10:03:00,2824.55,2826.45,2824,2826.45
2006-01-02 10:04:00,2826.45,2826.45,2824.9,2825.5
2006-01-02 10:05:00,2825.15,2825.5,2824,2824.85
2006-01-02 10:06:00,2824.7,2825.5,2823.7,2823.8
2006-01-02 10:07:00,2823.95,2824.45,2823.55,2824
2006-01-02 10:08:00,2824,2824.85,2823.5,2824.85
2006-01-02 10:09:00,2824.25,2825.45,2824,2825.45
2006-01-02 10:10:00,2825.2,2827,2825,2827

当我运行上述命令将数据导入 R 时,出现以下错误:

Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format

我试图找到解决问题的所有方法。我在网上阅读了很多博客,但没有一种方法适合我。

我希望有人能帮助我。

【问题讨论】:

  • 听起来你的日期栏中有什么东西在搞砸它。可能是一个杂散的空白,“-”,“,”,“n.a.”或类似的东西。
  • 您确定您的sep 是逗号吗?您的示例 csv 文件格式看起来像是标签?
  • 以逗号分隔。我在记事本中打开我的 csv 文件,它清楚地显示逗号分隔
  • 那很好 - 只是在您的问题中,您提供的示例数据中没有逗号,我想将其作为问题消除。
  • 请注意,您的代码确实适用于问题中修改后的示例数据,因此您没有显示导致问题的某些内容。

标签: r xts zoo


【解决方案1】:

虽然这似乎是一篇旧帖子,但我想分享我的经验,因为我经历了一个类似的非常令人沮丧的过程,试图将时间序列 csv 数据加载到 R 中。 上面的问题是excel把日期和时间的格式改成下面的%m/%d/%Y %H:%M,基本上就掉秒了。如果您读取具有此格式的文件并且您有第二个分辨率数据,您将获得多个相似的日期时间组合。所以你不能简单地使用忽略秒的格式,因为它会给出以下错误消息。 "字符串不是标准的明确格式"

解决办法是回到excel,把日期时间列的格式改成%m/%d/%Y %H:%M:%S。您可以通过选择最接近所需格式的日期时间默认格式来做到这一点(在本例中为%m/%d/%Y %H:%M,然后在末尾手动添加:ss。将文件保存为 csv 文件,然后使用以下命令读取它命令:

Data<-read.zoo("file.csv", tz="", header=TRUE,format='%m/%d/%Y %H:%M:%S')

这对我有用,我读取了一个包含大约 900K 行的文件。

【讨论】:

    【解决方案2】:

    看起来该错误是由于 R 无法识别您的日期列的格式(它无法解决 -- 日期/月/年?月/日/年?等等)。

    您可以使用read.zooformat 参数告诉R 它是什么格式(请参阅?strptime 了解您可以使用的说明符)。

    例如,如果是日期/月/年小时(24 小时制):分钟,您可以这样做:

    EURUSD <- as.xts(read.zoo(file_name,
                              sep=',', 
                              tz='',   
                              header=T,
                              format='%d/%m/%Y %H:%M:%S')) # see the 'format' argument?
    

    (注意 - 在您的问题中,您显示的 csv 数据的 sn-p 不是逗号分隔的)。

    【讨论】:

    • 我尝试使用 read.zoo("C:/Users/ParamJeet/Desktop/test/eurusd.csv",sep=",",tz="",format="%Y-% m-%d %H:%M" ,header=T) 但它给了我错误: read.zoo("C:/Users/ParamJeet/Desktop/test/eurusd.csv", sep = ",", :索引在数据行中有 13428 个错误条目:323559 323560 323561 323562 323563
    • 然后看看你 csv 中的那些行 - 我猜它们有不同的格式。
    • 如果我打开记事本,它看起来像 Date,Open,Low,High,Close 2006-01-02 10:01:00,2822.9,2825.45,2822.1,2824.9 如果我在 excel 中打开数据看起来像 Date Open Low High Close 1/2/2006 10:01 2822.9 2825.45 2822.1 2824.9 1/2/2006 10:02 2825 2825.9 2824 2824.95 这认为这种差异导致了问题。
    • 我看到在您更新的问题中,日期列也有几秒钟 - 我已经更新了我的答案以将其包含在格式中。您将需要查看 R 告诉您的坏行,即 rows 323559 323560 323561 323562 323563 并查看它们是否与其他行不同。 zoo 对象不能有重复的索引,所以你不能有重复的时间。检查 R 所说的“坏”是否是重复的,或者相对于您输入 read.zooformat 格式错误。
    • 我测试了另一个可以工作的小 csv 文件,前提是该文件在记事本和 Excel 中显示相同的日期时间格式。现在问题出在我的文件中,它在 Excel 中显示日期,例如 Date 1/2/2006 10:01 1/2/2006 10:02 和在记事本中,例如 Date, 2006-01-02 10:01:00, 2006-01 -02 10:02:00,。这种格式差异导致错误。你能说出为什么日期时间格式的这种差异会出现在记事本和 excel 中吗
    【解决方案3】:

    当日期列像一个字符时,不使用 as.xtc 读取文件。然后使用此函数将日期转换为 POSIXlt 类:

    library("chron")
    DateConvert<-function(x){
      dt<-strsplit(x,split = "T")
      dt<-unlist(dt)
      d1<-dt[1:length(dt) %% 2==1 ]
      d2<-dt[1:length(dt) %% 2==0 ]
      a<-as.POSIXlt(chron(dates.=d1, times.=d2, format = c(dates = "y-m-d", times = "h:m:s")))
      return(a)
    }
    
    DateConvert('Your column')
    

    然后对你的数据使用 as.xts 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 2011-04-03
      • 2016-11-03
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      相关资源
      最近更新 更多