我发现一个非常恼人的问题,希望与社区分享。这是一个我已经找到了可接受解决方案的问题(详见下文),但现在我有几个后续问题。我的时间戳和POSIX变量知识有限,特别是plyr、dplyr和readr如何处理它们。
使用POSIX变量(即日期和时间戳)时,我发现readr的write_csv会将这些变量改为UTC时间。
我正在从API下载数据并保留时间戳。每次获取数据时,我将其绑定到现有文件并保存该文件。我的时区是MDT,并且我正在使用MDT时间请求数据,然后尝试将其绑定到UTC时间的文件中,但时间不匹配......这很混乱和令人沮丧。本质上,我试图创建的美丽的时间戳数据库正在变成一堆垃圾。
为解决这个问题,我将POSIX时间列转换为字符列,使用:
df.time <- as.character(df.time)
这使我能够按照API返回给我的时间戳一致的时区保存文件。
这引出了以下一系列问题:
- 是否有一个程序可以跨时区连接POSIX变量?例如,如果现在是MDT中午12点,那么在UTC时间为下午6点。我能否基于这些时间戳连接两个数据框而无需先将它们转换为相同的时区?
- 是否可能防止write_csv将POSIX变量更改为UTC?
- 是否有一个csv写入函数不会更改POSIX变量?
> 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
x
是一个POSIXct
对象来说,as.Date(x)
默认将tz =“UTC”
; 因此,如果您在POSIXct
对象上使用as.Date
,并且没有明确匹配时区,则时间将转换为UTC。但这与write_csv
无关。 - Maurits Eversread_csv
将t
存储为UTC时间。我不确定之前我做了什么。我确实进行了检查,但可能做错了什么。对于造成的困惑,非常抱歉! - Maurits Evers