【发布时间】:2015-07-24 17:56:01
【问题描述】:
这是我找到的最近的链接:https://stats.stackexchange.com/questions/5305/how-to-re-sample-an-xts-time-series-in-r
但我没有看到任何关于聚合数据的不同方法(如均值、计数、匿名函数),您可以在 pandas 中执行这些方法。
对于我的程序,我试图每 2 分钟重新采样一次数据帧,并在每个间隔取 2 个值的平均值。谢谢!
【问题讨论】:
这是我找到的最近的链接:https://stats.stackexchange.com/questions/5305/how-to-re-sample-an-xts-time-series-in-r
但我没有看到任何关于聚合数据的不同方法(如均值、计数、匿名函数),您可以在 pandas 中执行这些方法。
对于我的程序,我试图每 2 分钟重新采样一次数据帧,并在每个间隔取 2 个值的平均值。谢谢!
【问题讨论】:
如果您使用data.table 和lubridate,它可能看起来像这样
library(data.table)
library(lubridate)
#sample data
dt<-data.table(ts=seq(from=ymd('2015-01-01'), to=ymd('2015-07-01'),by='mins'), datum=runif(260641,0,100))
如果您想从分钟到每小时获取数据,您可以这样做
dt[,mean(datum),by=floor_date(ts,"hour")]
如果你有一堆列并且你希望所有的列都被平均,你可以这样做
dt[,lapply(.SD,mean),by=floor_date(ts,"hour")]
您可以将mean 替换为您想要的任何功能。您可以将“小时”替换为“秒”、“分钟”、“小时”、“日”、“周”、“月”、“年”。好吧,你不能从一分钟到几秒,因为那需要魔法,但无论如何你都可以从微秒到几秒。
不可能将序列从较低的周期性转换为 更高的周期性 - 例如每周到每天或每天到 5 分钟的酒吧, 因为那需要魔法。
-来自 xts 手册的 Jeffrey Ryan。
我从来没有学过 xts,所以我不知道用 xts 对象做它的语法,但那条线很有名(或者至少和手册中的一条线一样有名)
【讨论】:
dt[,lapply(.SD,mean),by=minutes(floor(as.numeric(difftime(ts,ymd('1970-01-01'),units="mins"))/5)*5)+ymd('1970-01-01')] 之类的操作,您可以在其中找到自某个任意日期以来的分钟数除以您想要的任何范围,取将其乘以除以的相同的值,然后将其添加到相同的任意日期。
我发现这个主题正在寻找与 pandas resample() 等效的 R,但用于 xts 对象。为了以防万一,我发布了一个解决方案,时间增量为 5 分钟,其中 ts 是一个 xts 对象:
period.apply(ts, endpoints(ts, k=5, "minutes"), mean)
【讨论】:
你可以使用 reticulate 来利用 pandas 方法
require(reticulate)
pd <- import("pandas")
df <- r_to_py(df) #Transform to Pandas DataFrame
df = df$set_index(pd$DatetimeIndex(df['Date']))
#df_meidan_hours=df$resample('1H', how='median', closed='left', label='left')
df_meidan_hours=df$resample('1H',closed='left', label='left')$agg('median')
df_meidan_hours <- py_to_r(df_meidan_hours) #Transform back to r's data.frame
【讨论】:
您查看过 R COIN 包吗?这是一个教程,可以帮助您确定这是否是您正在寻找的内容:http://www.statmethods.net/stats/resampling.html
可以在此处找到有关该软件包的更多信息:https://cran.r-project.org/web/packages/coin/coin.pdf
【讨论】: