【问题标题】:How to perform R time based resampling with a given time period equivalently to using pandas 'resample' functions?如何在给定的时间段内执行基于 R 时间的重采样,相当于使用 pandas 的“重采样”函数?
【发布时间】:2017-05-24 10:22:29
【问题描述】:

我正在尝试找到一种方法来执行与下面的熊猫操作等效的重新采样操作:

示例原始数据框df:

                      FT
Time                     
2017-03-18 23:30:00  73.9
2017-03-18 23:31:00  73.5
2017-03-18 23:32:00  71.6
2017-03-18 23:33:00  71.3
2017-03-18 23:34:00  72.3
2017-03-18 23:35:00  72.1
2017-03-18 23:36:00  70.1
2017-03-18 23:37:00  67.9
2017-03-18 23:38:00  65.4
2017-03-18 23:39:00  63.4
2017-03-18 23:40:00  61.3
2017-03-18 23:41:00  59.9
2017-03-18 23:42:00  58.4
2017-03-18 23:43:00  58.4
2017-03-18 23:44:00  55.6
2017-03-18 23:45:00  54.3
2017-03-18 23:46:00  54.3
2017-03-18 23:47:00  53.0
2017-03-18 23:48:00  51.9
2017-03-18 23:49:00  50.8
2017-03-18 23:50:00  49.8
2017-03-18 23:51:00  48.9
2017-03-18 23:52:00  47.6
2017-03-18 23:53:00  44.5
2017-03-18 23:54:00  57.2
2017-03-18 23:55:00  61.6
2017-03-18 23:56:00  59.8
2017-03-18 23:57:00  58.0
2017-03-18 23:58:00  56.2
2017-03-18 23:59:00  56.2

重采样:

date_format= '%d-%b-%Y %H:%M:%S'
df.index=pd.to_datetime(df.index,format=date_format)
df=df.resample('5Min').mean()

输出:

                  FT
Time                      
2017-03-18 23:30:00  72.52
2017-03-18 23:35:00  67.78
2017-03-18 23:40:00  58.72
2017-03-18 23:45:00  52.86
2017-03-18 23:50:00  49.60
2017-03-18 23:55:00  58.36

我想知道使用给定聚合函数(例如均值、总和等)和给定采样时间重新采样数据帧的最简单方法。在 Pandas 中,我知道不使用插值,并且 resample 函数执行“分组”操作。

我猜可以通过这种方式转换为日期时间:

df$Time=strptime(df$Time,"%d-%b-%Y %H:%M:%S")

但我不确定应该将哪个 R 库用于重采样操作本身。

谢谢

编辑:

使用我获得的 readr read_csv

# A tibble: 43,981 × 6
                   Time Power   Tin    FT    RT  Flow
*                 <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1  16-Feb-2017 11:00:00  0.09 18.87  57.9  53.3    17
2  16-Feb-2017 11:01:00  0.09 18.87  57.9  53.3    17
3  16-Feb-2017 11:02:00  0.09 18.87  57.9  53.3    17
4  16-Feb-2017 11:03:00  0.09 18.87  57.9  53.3    17
5  16-Feb-2017 11:04:00  0.09 18.87  57.9  53.3    17
6  16-Feb-2017 11:05:00  0.09 18.87  57.9  53.3    17
7  16-Feb-2017 11:06:00  0.09 18.87  57.9  53.3    17
8  16-Feb-2017 11:07:00  0.09 18.87  57.9  53.3    17
9  16-Feb-2017 11:08:00  0.09 18.87  57.9  53.3    17
10 16-Feb-2017 11:09:00  0.09 18.87  57.9  53.3    17
# ... with 43,971 more rows

但是

df %>% thicken("5 min") %>% group_by(Time_5_min) %>% summarise(mean(FT))

给出以下错误:

"Error: x does not contain a variable of class Date, POSIXct, or POSIXlt.
Traceback:"

更新:

@Edwin 给出的解决方案效果很好

我使用以下转换为日期时间。

df$Time=as.POSIXct(df$Time, format="%d-%b-%Y %H:%M:%S")

【问题讨论】:

  • 您能否澄清df %&gt;% thicken("5 min") %&gt;% group_by(Time_5_min) %&gt;% summarise(mean(FT)) 行中的 Time_5_min 是什么? @user7188934
  • 我想通了 - 运行 df %&gt;% thicken("5 min") 时,thicken 函数会自动将 time_5_min 列添加到数据帧中

标签: r datetime time-series


【解决方案1】:

使用dplyrpadr。 (这是假设 Time 是一个日期时间变量,如果您使用来自 readr 的函数,它将是。)

library(dplyr); library(padr)
dt$Time <- anytime::anytime(dt$Time)
dt %>% thicken("5 min") %>% group_by(Time_5_min) %>% summarise(mean(FT))

【讨论】:

  • 谢谢您,能否请您也添加您提到的阅读器功能的使用?
  • 取决于你要读取的文件类型read_csvread_delim
  • 非常感谢,我使用 as.POSIXct 并且 padr 解决方案有效
  • 是的,您的数据在月份中采用了非标准格式。编辑示例
猜你喜欢
  • 2014-07-24
  • 2019-01-18
  • 1970-01-01
  • 2022-11-13
  • 2020-03-09
  • 2016-10-03
  • 2017-02-03
  • 1970-01-01
  • 2014-09-29
相关资源
最近更新 更多