【问题标题】:R Losing Precision of Decimal Points When Reading/Writing CSV?R在读/写CSV时失去小数点的精度?
【发布时间】:2021-12-13 02:20:41
【问题描述】:

我正在使用来自readr 包的read_csv 使用R 读取数据。我有精确到十分之一秒的时间值,格式如下:2018-12-30T21:25:32.200,直到T 的所有内容都是日期,时间之后的所有内容都是 HH:MM:SS:fraction-of-秒格式。

但是,当使用read_csv 将其分配给变量时,打印时会重新格式化并截断为2018-12-30 21:25:32 UTC。我不确定 UTC 来自哪里,或者我的几分之一秒要去哪里。当我使用 write_csv 将此数据写回 csv 时,结果如下:2018-12-30T21:25:32Z。如何防止我的数据被切断?一秒钟的数据对我的项目至关重要。

【问题讨论】:

  • 您尚未向我们展示您是如何指定输入格式的。如果您使用format="%Y-%m-%dT%H:%M:%OS" 进行输入转换,则应存储小数秒,但不显示。您可以使用格式“%Y-%m-%d %H:%M:%OS3”进行输出来显示它们。
  • 通过dput 查看您的价值观。这将使您避免假设打印到控制台输出已完成的常见错误。 R时间也是UTC的商店。您需要研究帮助页面?DateTimeClasses,并且您需要提供一个完整的示例,因为说“将此数据写回 csv”没有代码来赋予它特异性。
  • 来自?write_csv"POSIXct 的格式为 ISO8601,带有 UTC 时区_注意:本地或非 UTC 时区中的 'POSIXct' 对象将在写入之前转换为 UTC 时间。_" 。我不是ISO8601 的专家,但它没有强制 次秒;虽然我与您一样对静默截断感到沮丧,但如果您需要控制输出中的亚秒级分辨率,我建议您自己将其转换为字符串。

标签: r dataframe csv decimal truncate


【解决方案1】:

您必须设置 digits.secs 选项才能正确查看和写入毫秒:

# Create test data
f <- file("test.csv", open = "w")
writeLines("MyPreciseTime", con = f)
writeLines("2018-12-30T21:25:32.200", con = f)
writeLines("2018-12-30T21:25:32.201", con = f)
writeLines("2018-12-30T21:25:32.202", con = f)
close(f)

library(readr)

# Input format not specified but milliseconds still stored
df <- read_csv("test.csv")

# Set the options for digits.secs
options(digits.secs = 3)

# Now print will show the milliseconds
print(df$MyPreciseTime, usetz = FALSE)
# [1] "2018-12-30 21:25:32.200" "2018-12-30 21:25:32.200"
# [3] "2018-12-30 21:25:32.201" 

请注意,如果digits.secs 选项设置得当,write_csv() 将在写回时间时使用指定的精度。通常它不会以毫秒为单位写入。因此,在处理精确时间时,这是一个很有价值的选择。

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2023-02-07
    相关资源
    最近更新 更多