简体   繁体   English

如何将每小时测量的数据(时间戳)转换为 R 中的半小时时间戳?

[英]How do i convert hourly measured data (Time stamps) to half hourly time stamps in R?

This shows the dput() result of an example dataset.这显示了示例数据集的 dput() 结果。 To use an interpolation of the ReddyProc package i need to convert the timeseries to half hourly data.要使用 ReddyProc 包的插值,我需要将时间序列转换为半小时数据。 if possible i want to split the measured data as well, so that i have 50% of each original data point in the new 30 min rows.如果可能,我也想拆分测量数据,以便在新的 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")

Here is one possible tidyverse solution.这是一种可能的tidyverse解决方案。 The basic idea is to create a new sequence of date/times every 30 min, join the original data, and anywhere where the minutes are 30 take 50% of the values from the previous whole hour.基本思想是每 30 分钟创建一个新的日期/时间序列,加入原始数据,并且在分钟为30任何地方取前一小时值的 50%。 Eg 50% of the values from 7:00 goes to 7:30.例如,从 7:00 到 7:30 的值的 50%。

I assigned your dput to df .我将您的dput分配给df

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   


Another solution would be to take 50% of all values and store a new dataframe.另一种解决方案是取所有值的 50% 并存储一个新的数据帧。 Then add 30 min to all values and row bind the 50% dataframe and the 50% + 30 min dataframe.然后将 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM