r - 如何将每小时测量的数据(时间戳)转换为 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")
解决方案
这是一种可能的tidyverse
解决方案。基本思想是每 30 分钟创建一个新的日期/时间序列,加入原始数据,在任何地方,分钟30
取前一个整小时的 50% 的值。例如,从 7:00 到 7:30 的值的 50%。
我把你分配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
另一种解决方案是获取所有值的 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
推荐阅读
- r - R ggplot geom_raster 增加行高以避免点重叠
- apache-kafka - 当记录从多个源插入源主题时,Kafka 源连接器未按预期提取记录
- spring-boot - Spring boot + tomcat部署+非法循环继承依赖问题
- amazon-web-services - DynamoDB:如何在 GSI 上查询按排序键排序的多个分区键
- php - 我正在使用 Laravel Passport 进行身份验证,那么在从 api 接收承载令牌后如何在我的应用程序中应用身份验证
- coq - 如何使用定义来证明某事?
- dart - 带有右边框的圆角卡片小部件颤动
- javascript - 在 Angular 7 中,变更检测周期被多次调用
- python - Python manage.py 在 Visual Studio Code 编辑器中不断出现错误
- javascript - 将完整的日期字符串(如“2019 年 3 月 23 日星期六”)转换为 Javascript Date()