根据时分列创建年月日序列

问题描述 投票:0回答:2

我有以下数据集:

structure(list(Zeit = c("8:30:00 PM", "8:45:00 PM", "9:00:00 PM", 
"9:15:00 PM", "9:30:00 PM", "9:45:00 PM", "10:00:00 PM", "10:15:00 PM", 
"10:45:00 PM", "11:15:00 PM", "11:45:00 PM", "12:15:00 AM", "12:45:00 AM", 
"1:15:00 AM", "1:45:00 AM", "2:15:00 AM", "2:45:00 AM", "3:15:00 AM", 
"3:45:00 AM", "4:15:00 AM"), SRB = c(1.0397346014, 0.98344320764, 
0.78642332948, 0.7582776326, 0.67384054196, 0.51434825964, 0.46743876484, 
0.39238357316, 0.0827809074800001, 0.0264895137199999, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0)), row.names = 43:62, class = "data.frame")

如您所见,我的时间戳中只有小时和分钟。我想创建一个包含日期、月份和年份的新列,从 2023 年 10 月 24 日开始。 (原始)数据集更长,所以我想要一个自动识别新的一天的代码。

编辑:下面的完整数据集

structure(list(Zeit = c("11:35:00 AM", "12:43:00 PM", "12:48:00 PM", 
"12:53:00 PM", "12:58:00 PM", "1:03:00 PM", "1:08:00 PM", "1:13:00 PM", 
"1:18:00 PM", "1:23:00 PM", "1:28:00 PM", "1:33:00 PM", "1:38:00 PM", 
"1:43:00 PM", "1:48:00 PM", "1:53:00 PM", "1:58:00 PM", "2:03:00 PM", 
"2:30:00 PM", "2:45:00 PM", "3:00:00 PM", "3:15:00 PM", "3:30:00 PM", 
"3:45:00 PM", "4:00:00 PM", "4:15:00 PM", "4:30:00 PM", "4:45:00 PM", 
"5:00:00 PM", "5:15:00 PM", "5:30:00 PM", "5:45:00 PM", "6:00:00 PM", 
"6:15:00 PM", "6:30:00 PM", "6:45:00 PM", "7:00:00 PM", "7:15:00 PM", 
"7:30:00 PM", "7:45:00 PM", "8:00:00 PM", "8:15:00 PM", "8:30:00 PM", 
"8:45:00 PM", "9:00:00 PM", "9:15:00 PM", "9:30:00 PM", "9:45:00 PM", 
"10:00:00 PM", "10:15:00 PM", "10:45:00 PM", "11:15:00 PM", "11:45:00 PM", 
"12:15:00 AM", "12:45:00 AM", "1:15:00 AM", "1:45:00 AM", "2:15:00 AM", 
"2:45:00 AM", "3:15:00 AM", "3:45:00 AM", "4:15:00 AM"), SRB = c(0, 
0, 0, 0, 0, 0, 0, 0.0546352106, 1.89348740676, 14.16501124644, 
33.21026613524, 45.19095110716, 51.16722074468, 46.13852290212, 
38.99889779356, 31.72792609956, 26.59602736844, 23.91280426588, 
18.5369761618, 13.35816793588, 10.76876382292, 8.55463566836, 
7.29746120772, 5.824503071, 4.16390695508, 3.49779212892, 3.36644554348, 
2.5877479298, 2.24999956724, 2.27814526412, 2.10927108284, 1.94977880052, 
1.84657791196, 1.64017613484, 1.48068385252, 1.49006575148, 1.3211915702, 
1.35871916604, 1.58388474108, 1.40562866084, 1.39624676188, 1.16169928788, 
1.0397346014, 0.98344320764, 0.78642332948, 0.7582776326, 0.67384054196, 
0.51434825964, 0.46743876484, 0.39238357316, 0.0827809074800001, 
0.0264895137199999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, 
-62L), class = "data.frame")
r time lubridate
2个回答
1
投票

也许您可以在观察从

PM
AM
的转变后开始计算新的一天,例如,

x <- gsub(".*\\s", "", df$Zeit)
cbind(date = as.Date("2023-10-24") + cumsum(x == "AM" & c(NA, head(x, -1)) == "PM"), df)

你将获得

         date        Zeit        SRB
43 2023-10-24  8:30:00 PM 1.03973460
44 2023-10-24  8:45:00 PM 0.98344321
45 2023-10-24  9:00:00 PM 0.78642333
46 2023-10-24  9:15:00 PM 0.75827763
47 2023-10-24  9:30:00 PM 0.67384054
48 2023-10-24  9:45:00 PM 0.51434826
49 2023-10-24 10:00:00 PM 0.46743876
50 2023-10-24 10:15:00 PM 0.39238357
51 2023-10-24 10:45:00 PM 0.08278091
52 2023-10-24 11:15:00 PM 0.02648951
53 2023-10-24 11:45:00 PM 0.00000000
54 2023-10-25 12:15:00 AM 0.00000000
55 2023-10-25 12:45:00 AM 0.00000000
56 2023-10-25  1:15:00 AM 0.00000000
57 2023-10-25  1:45:00 AM 0.00000000
58 2023-10-25  2:15:00 AM 0.00000000
59 2023-10-25  2:45:00 AM 0.00000000
60 2023-10-25  3:15:00 AM 0.00000000
61 2023-10-25  3:45:00 AM 0.00000000
62 2023-10-25  4:15:00 AM 0.00000000

0
投票

如果我们可以假设一天中的任何时间回溯都意味着“明天”并且没有跳过任何一天,那么我们可以这样做:

dat |>
  transform(Zeit2 = as.POSIXct(paste("2023-10-24", Zeit), format = "%Y-%m-%d %I:%M:%S %p")) |>
  transform(Zeit2 = Zeit2 + 86400 * cumsum(c(FALSE, diff(newtime) < 0)))
#           Zeit      SRB               Zeit2
# 43  8:30:00 PM 1.039735 2023-10-24 20:30:00
# 44  8:45:00 PM 0.983443 2023-10-24 20:45:00
# 45  9:00:00 PM 0.786423 2023-10-24 21:00:00
# 46  9:15:00 PM 0.758278 2023-10-24 21:15:00
# 47  9:30:00 PM 0.673841 2023-10-24 21:30:00
# 48  9:45:00 PM 0.514348 2023-10-24 21:45:00
# 49 10:00:00 PM 0.467439 2023-10-24 22:00:00
# 50 10:15:00 PM 0.392384 2023-10-24 22:15:00
# 51 10:45:00 PM 0.082781 2023-10-24 22:45:00
# 52 11:15:00 PM 0.026490 2023-10-24 23:15:00
# 53 11:45:00 PM 0.000000 2023-10-24 23:45:00
# 54 12:15:00 AM 0.000000 2023-10-25 00:15:00
# 55 12:45:00 AM 0.000000 2023-10-25 00:45:00
# 56  1:15:00 AM 0.000000 2023-10-25 01:15:00
# 57  1:45:00 AM 0.000000 2023-10-25 01:45:00
# 58  2:15:00 AM 0.000000 2023-10-25 02:15:00
# 59  2:45:00 AM 0.000000 2023-10-25 02:45:00
# 60  3:15:00 AM 0.000000 2023-10-25 03:15:00
# 61  3:45:00 AM 0.000000 2023-10-25 03:45:00
# 62  4:15:00 AM 0.000000 2023-10-25 04:15:00

(我重命名为

Zeit2
只是为了并排比较。如果您愿意,可以安全地覆盖
Zeit
。)

© www.soinside.com 2019 - 2024. All rights reserved.