【发布时间】:2018-12-31 12:30:35
【问题描述】:
我发现了一个非常烦人的问题,我想与社区分享。这是一个我找到了可接受的解决方案的问题(详见下文),但我现在有几个后续问题。我对时间戳和 POSIX 变量的了解有限,特别是 plyr、dplyr 和 readr 如何处理这些。
在使用 POSIX 变量(又名日期和时间戳)时,我发现来自 readr 的 write_csv 将这些变量更改为 UTC 时间。
我正在从 API 下载数据并保留时间戳。每次抓取数据时,我都会将其绑定到现有文件并保存文件。我的时区是 MDT,我正在使用 MDT 时间请求数据,然后我试图在 UTC 时间绑定到一个文件,但时间不匹配......它变得混乱和令人沮丧。本质上,我正在尝试创建的漂亮时间戳数据库正在变成一堆垃圾。
为了解决这个问题,我使用以下方法将 POSIX 时间列转换为字符列:
df.time <- as.character(df.time)
这使我可以将文件保存在与 API 返回给我的时间戳一致的时区中。
这导致我提出以下一系列问题:
- 是否有可以跨时区连接 POSIX 变量的程序?例如,如果它是 MDT 中午,则它是 UTC 下午 6 点。我可以根据这些时间戳加入两个数据帧,而不必先将它们转换为相同的时区吗?
- 是否可以防止 write_csv 将 POSIX 变量更改为 UTC?
- 是否有不更改 POSIX 变量的 csv 写入函数?
编辑:我已经包含了一些我正在谈论的示例数据:
> df1 <- as.data.frame(fromJSON("https://api.pro.coinbase.com/products/BTC-USD/candles?start=2018-07-23&12:57:00?stop=2018-07-23&19:34:58granularity=300"))
> colnames(df1) <- c("time", "low", "high", "open", "close", "volume")
> df1$time <- anytime(df1$time)
> df1Sort <- df1[order(df1$time),]
> head(df1Sort, 5)
time low high open close volume
299 2018-07-23 16:13:00 7747.00 7747.01 7747.01 7747.01 9.2029168
298 2018-07-23 16:14:00 7743.17 7747.01 7747.00 7747.01 7.0205668
297 2018-07-23 16:15:00 7745.47 7745.73 7745.67 7745.73 0.9075707
296 2018-07-23 16:16:00 7745.72 7745.73 7745.72 7745.73 4.6715157
295 2018-07-23 16:17:00 7745.72 7745.73 7745.72 7745.72 2.4921921
> write_csv(df1Sort, "df1Sort.csv", col_names = TRUE)
> df2 <- read_csv("df1Sort.csv", col_names = TRUE)
Parsed with column specification:
cols(
time = col_datetime(format = ""),
low = col_double(),
high = col_double(),
open = col_double(),
close = col_double(),
volume = col_double()
)
> head(df2, 5)
# A tibble: 5 x 6
time low high open close volume
<dttm> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2018-07-23 22:13:00 7747 7747 7747 7747 9.20
2 2018-07-23 22:14:00 7743 7747 7747 7747 7.02
3 2018-07-23 22:15:00 7745 7746 7746 7746 0.908
4 2018-07-23 22:16:00 7746 7746 7746 7746 4.67
5 2018-07-23 22:17:00 7746 7746 7746 7746 2.49
【问题讨论】:
-
你能分享一些你拥有什么样的数据以及它是什么样子的例子吗?在写作方面,一个快速(但不那么优雅)的解决方法是将时间戳写为一个字符,并带有相应的时区和偏移信息。我从
data.table使用fread没有任何问题。如果我们能看到您正在使用的数据,会更容易提供帮助。 -
“在使用 POSIX 变量(即日期和时间戳)时,我发现 readr 中的 write_csv 将这些变量更改为 UTC 时间。” 我不认为那是真的。我刚刚检查过,
write_csv将POSIXct存储在我的系统特定时区中。绝对不会转换为“UTC”。 -
我认为这里可能存在不同的问题;例如
as.Date(x)为x一个POSIXct对象默认设置tz = "UTC";因此,如果您在POSIXct对象上使用as.Date并且您不明确匹配时区,则时间将转换为 UTC。不过,这与write_csv无关。 -
@MauritsEvers 真的吗?在我的回答中,您对可重现的示例有不同的结果吗? (假设您不在 GMT+3 亚的斯亚贝巴时区...)如果它是特定于操作系统的,我不会太惊讶 - 我目前在 Windows 上。
-
@Gregor 好的,我刚刚检查过;我在 AEST,我可以重现您的示例:
read_csv以 UTC 存储t。我不确定我之前做了什么。我确实检查过,但一定做错了什么。很抱歉造成混乱!