首页 > 解决方案 > 如何将每小时测量的数据(时间戳)转换为 R 中的半小时时间戳?

问题描述

这显示了示例数据集的 dput() 结果。要使用 ReddyProc 包的插值,我需要将时间序列转换为半小时数据。如果可能的话,我也想拆分测量数据,以便在新的 30 分钟行中拥有每个原始数据点的 50%。

structure(list(DateTime = structure(c(1420873200, 1420876800,  1420880400, 1420884000, 1420887600, 1420891200, 1420894800, 1420898400,  1420902000, 1420905600, 1420909200, 1420912800, 1420916400, 1420920000,  1420923600, 1420927200, 1420930800, 1420934400, 1420938000, 1420941600,  1420945200, 1420948800, 1420952400, 1420956000, 1420959600, 1420963200,  1420966800, 1420970400, 1420974000, 1420977600, 1420981200, 1420984800,  1420988400, 1420992000, 1420995600, 1420999200, 1421002800, 1421006400,  1421010000, 1421013600, 1421017200, 1421020800, 1421024400, 1421028000,  1421031600, 1421035200, 1421038800, 1421042400, 1421046000, 1421049600,  1421053200, 1421056800, 1421060400, 1421064000, 1421067600, 1421071200,  1421074800, 1421078400, 1421082000, 1421085600, 1421089200, 1421092800,  1421096400, 1421100000, 1421103600, 1421107200, 1421110800, 1421114400,  1421118000, 1421121600, 1421125200, 1421128800, 1421132400, 1421136000,  1421139600, 1421143200, 1421146800, 1421150400, 1421154000, 1421157600,  1421161200, 1421164800, 1421168400, 1421172000, 1421175600, 1421179200,  1421182800, 1421186400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    ET_Luecken = c(0.0180291111111111, NA, 0.0387666458333333, 
    0.0868287638888889, NA, 0.0371648055555556, 0, 0, NA, 0, 
    0, NA, 0.0236666666666667, NA, 0.0882743541666667, NA, NA, 
    NA, NA, 0.0144913958333333, 0.00955538194444444, NA, NA, 
    0.0156629722222222, 0.0207738611111111, NA, 0, NA, 0.186093625, 
    0.112229138888889, 0.0673054722222222, NA, 0.0594349583333333, 
    0.117677520833333, 0.0577550972222222, 0.0476022986111111, 
    0.00105304166666667, NA, 0, 0, NA, NA, 0, 0, 0, 0, NA, NA, 
    NA, 0.0120022916666667, 0.0172474861111111, 0.0598623333333333, 
    0.0862082013888889, 0.0474110486111111, 0.0708637013888889, 
    0.0732488472222222, 0.0492967013888889, 0.0488969652777778, 
    NA, NA, NA, NA, 0, 0, NA, 0.0403970763888889, 0.0257798402777778, 
    0.0181726805555556, 0.0154094375, 0.016397125, 0.0182907222222222, 
    NA, NA, 0.0279021944444444, NA, NA, 0.139329256944444, 0.157206680555556, 
    0.00168182638888889, 0, 0, 0, 0, 0.0552787291666667, NA, 
    0.0659033958333333, 0.0214175, 0), ET_Orig = c(0.0180291111111111, 
    0.0251200208333333, 0.0387666458333333, 0.0868287638888889, 
    0.202853625, 0.0371648055555556, 0, 0, 0, 0, 0, 0, 0.0236666666666667, 
    0.121502131944444, 0.0882743541666667, 0.0596147083333333, 
    0.0217678819444444, 0.0155198611111111, 0.0264406041666667, 
    0.0144913958333333, 0.00955538194444444, 0.00814314583333333, 
    0.00995740972222222, 0.0156629722222222, 0.0207738611111111, 
    0, 0, 0, 0.186093625, 0.112229138888889, 0.0673054722222222, 
    0.0359689444444444, 0.0594349583333333, 0.117677520833333, 
    0.0577550972222222, 0.0476022986111111, 0.00105304166666667, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0.000332694444444444, 0.003391625, 
    0.00738370833333333, 0.0120022916666667, 0.0172474861111111, 
    0.0598623333333333, 0.0862082013888889, 0.0474110486111111, 
    0.0708637013888889, 0.0732488472222222, 0.0492967013888889, 
    0.0488969652777778, 0.0463059513888889, 0.00118007638888889, 
    0, 0, 0, 0, 0.0379927430555556, 0.0403970763888889, 0.0257798402777778, 
    0.0181726805555556, 0.0154094375, 0.016397125, 0.0182907222222222, 
    0.0170515833333333, 0.0201262708333333, 0.0279021944444444, 
    0.0539213819444444, 0.0843480902777778, 0.139329256944444, 
    0.157206680555556, 0.00168182638888889, 0, 0, 0, 0, 0.0552787291666667, 
    0.0182848958333333, 0.0659033958333333, 0.0214175, 0), ET_Lin = c(0.0180291111111111, 
    0.0283978784722222, 0.0387666458333333, 0.0868287638888889, 
    0.0619967847222222, 0.0371648055555556, 0, 0, 0, 0, 0, 0.0118333333333334, 
    0.0236666666666667, 0.0559705104166667, 0.0882743541666667, 
    0.0735177625, 0.0587611708333333, 0.0440045791666667, 0.0292479875, 
    0.0144913958333333, 0.00955538194444444, 0.0115912453703704, 
    0.0136271087962963, 0.0156629722222222, 0.0207738611111111, 
    0.0103869305555556, 0, 0.0930468125, 0.186093625, 0.112229138888889, 
    0.0673054722222222, 0.0633702152777778, 0.0594349583333333, 
    0.117677520833333, 0.0577550972222222, 0.0476022986111111, 
    0.00105304166666667, 0.000526520833333335, 0, 0, 0, 0, 0, 
    0, 0, 0, 0.00300057291666667, 0.00600114583333335, 0.00900171875000002, 
    0.0120022916666667, 0.0172474861111111, 0.0598623333333333, 
    0.0862082013888889, 0.0474110486111111, 0.0708637013888889, 
    0.0732488472222222, 0.0492967013888889, 0.0488969652777778, 
    0.0391175722222222, 0.0293381791666667, 0.0195587861111111, 
    0.00977939305555556, 0, 0, 0.0201985381944444, 0.0403970763888889, 
    0.0257798402777778, 0.0181726805555556, 0.0154094375, 0.016397125, 
    0.0182907222222222, 0.0214945462962963, 0.0246983703703703, 
    0.0279021944444444, 0.0650445486111109, 0.102186902777777, 
    0.139329256944444, 0.157206680555556, 0.00168182638888889, 
    0, 0, 0, 0, 0.0552787291666667, 0.0605910625, 0.0659033958333333, 
    0.0214175, 0), ET_ReddyProc = c("1.80291111111111E-2", NA, 
    "3.8766645833333301E-2", "8.6828763888888896E-2", NA, "3.7164805555555597E-2", 
    "0", "0", NA, "0", "0", NA, "2.36666666666667E-2", NA, "8.8274354166666694E-2", 
    NA, NA, NA, NA, "1.4491395833333301E-2", "9.5553819444444393E-3", 
    NA, NA, "1.56629722222222E-2", "2.0773861111111101E-2", NA, 
    "0", NA, "0.18609362500000001", "0.112229138888889", "6.7305472222222204E-2", 
    NA, "5.9434958333333301E-2", "0.11767752083333299", "5.7755097222222197E-2", 
    "4.76022986111111E-2", "1.05304166666667E-3", NA, "0", "0", 
    NA, NA, "0", "0", "0", "0", NA, NA, NA, "1.2002291666666699E-2", 
    "1.7247486111111099E-2", "5.9862333333333302E-2", "8.6208201388888905E-2", 
    "4.7411048611111103E-2", "7.0863701388888894E-2", "7.3248847222222205E-2", 
    "4.9296701388888899E-2", "4.8896965277777801E-2", NA, NA, 
    NA, NA, "0", "0", NA, "4.0397076388888897E-2", "2.5779840277777799E-2", 
    "1.8172680555555602E-2", "1.54094375E-2", "1.6397124999999999E-2", 
    "1.8290722222222201E-2", NA, NA, "2.79021944444444E-2", NA, 
    NA, "0.13932925694444401", "0.15720668055555601", "1.68182638888889E-3", 
    "0", "0", "0", "0", "5.52787291666667E-2", NA, "6.5903395833333295E-2", 
    "2.1417499999999999E-2", "0")), row.names = c(NA, -88L), class = "data.frame")

标签: rtime

解决方案


这是一种可能的tidyverse解决方案。基本思想是每 30 分钟创建一个新的日期/时间序列,加入原始数据,在任何地方,分钟30取前一个整小时的 50% 的值。例如,从 7:00 到 7:30 的值的 50%。

我把你分配dputdf.

library(tidyverse)

data.frame(DateTime = seq(min(df$DateTime), max(df$DateTime), by = '30 min')) %>%
  left_join(df) %>%
  mutate(ET_ReddyProc = as.numeric(ET_ReddyProc)) %>%
  pivot_longer(starts_with('ET')) %>%
  arrange(name, DateTime) %>%
  mutate(value = ifelse(minute(DateTime) == 30, lag(value)/2, value/2)) %>%
  pivot_wider()

#---------------
   DateTime             ET_Lin ET_Luecken ET_Orig ET_ReddyProc
   <dttm>                <dbl>      <dbl>   <dbl>        <dbl>
 1 2015-01-10 07:00:00 0.00901    0.00901 0.00901      0.00901
 2 2015-01-10 07:30:00 0.00901    0.00901 0.00901      0.00901
 3 2015-01-10 08:00:00 0.0142    NA       0.0126      NA      
 4 2015-01-10 08:30:00 0.0142    NA       0.0126      NA      
 5 2015-01-10 09:00:00 0.0194     0.0194  0.0194       0.0194 
 6 2015-01-10 09:30:00 0.0194     0.0194  0.0194       0.0194 
 7 2015-01-10 10:00:00 0.0434     0.0434  0.0434       0.0434 
 8 2015-01-10 10:30:00 0.0434     0.0434  0.0434       0.0434 
 9 2015-01-10 11:00:00 0.0310    NA       0.101       NA      
10 2015-01-10 11:30:00 0.0310    NA       0.101       NA   


另一种解决方案是获取所有值的 50% 并存储一个新的数据帧。然后将 30 分钟添加到所有值并行绑定 50% 数据帧和 50% + 30 分钟数据帧。

df_50prcnt <- df %>% 
  mutate(ET_ReddyProc = as.numeric(ET_ReddyProc)) %>%
  mutate(across(starts_with('ET'), ~.x * 0.5))

df_50prcnt %>%
  mutate(DateTime = DateTime + minutes(30)) %>%
  bind_rows(df_50prcnt) %>%
  arrange(DateTime)


#-------------
            DateTime   ET_Luecken      ET_Orig       ET_Lin ET_ReddyProc
1   2015-01-10 07:00:00 0.0090145556 0.0090145556 0.0090145556 0.0090145556
2   2015-01-10 07:30:00 0.0090145556 0.0090145556 0.0090145556 0.0090145556
3   2015-01-10 08:00:00           NA 0.0125600104 0.0141989392           NA
4   2015-01-10 08:30:00           NA 0.0125600104 0.0141989392           NA
5   2015-01-10 09:00:00 0.0193833229 0.0193833229 0.0193833229 0.0193833229
6   2015-01-10 09:30:00 0.0193833229 0.0193833229 0.0193833229 0.0193833229
7   2015-01-10 10:00:00 0.0434143819 0.0434143819 0.0434143819 0.0434143819
8   2015-01-10 10:30:00 0.0434143819 0.0434143819 0.0434143819 0.0434143819
9   2015-01-10 11:00:00           NA 0.1014268125 0.0309983924           NA
10  2015-01-10 11:30:00           NA 0.1014268125 0.0309983924           NA


推荐阅读