我有以下数据集:

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")

推荐答案

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

out <- 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(Zeit2) < 0)))
out
#           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

如果允许某些回溯,那么我们可以将< 0更改为更负的值,例如< (-3*3600),这意味着回溯不会超过3小时(以秒为单位).

我倾向于将日期和时间放在一个字段中,但如果您想将它们分开,那么只需使用as.Date(trunc(.)):

out |>
  transform(Datum = as.Date(trunc(Zeit2)))
#           Zeit      SRB               Zeit2      Datum
# 43  8:30:00 PM 1.039735 2023-10-24 20:30:00 2023-10-24
# 44  8:45:00 PM 0.983443 2023-10-24 20:45:00 2023-10-24
# 45  9:00:00 PM 0.786423 2023-10-24 21:00:00 2023-10-24
# 46  9:15:00 PM 0.758278 2023-10-24 21:15:00 2023-10-24
# 47  9:30:00 PM 0.673841 2023-10-24 21:30:00 2023-10-24
# 48  9:45:00 PM 0.514348 2023-10-24 21:45:00 2023-10-24
# 49 10:00:00 PM 0.467439 2023-10-24 22:00:00 2023-10-24
# 50 10:15:00 PM 0.392384 2023-10-24 22:15:00 2023-10-24
# 51 10:45:00 PM 0.082781 2023-10-24 22:45:00 2023-10-24
# 52 11:15:00 PM 0.026490 2023-10-24 23:15:00 2023-10-24
# 53 11:45:00 PM 0.000000 2023-10-24 23:45:00 2023-10-24
# 54 12:15:00 AM 0.000000 2023-10-25 00:15:00 2023-10-25
# 55 12:45:00 AM 0.000000 2023-10-25 00:45:00 2023-10-25
# 56  1:15:00 AM 0.000000 2023-10-25 01:15:00 2023-10-25
# 57  1:45:00 AM 0.000000 2023-10-25 01:45:00 2023-10-25
# 58  2:15:00 AM 0.000000 2023-10-25 02:15:00 2023-10-25
# 59  2:45:00 AM 0.000000 2023-10-25 02:45:00 2023-10-25
# 60  3:15:00 AM 0.000000 2023-10-25 03:15:00 2023-10-25
# 61  3:45:00 AM 0.000000 2023-10-25 03:45:00 2023-10-25
# 62  4:15:00 AM 0.000000 2023-10-25 04:15:00 2023-10-25

这既适用于OP中的部分数据集,也适用于较大的数据集.

R相关问答推荐

在ggplot的注释表格中突出显示最大值

过滤矩阵以获得R中的唯一组合

提取R中值和列名的所有可能组合

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

编辑文件后编辑RhandsonTable

次级y轴R gggplot2

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

在ggplot2的框图中绘制所有级别的系数

使用带有OR条件的grepl过滤字符串

如何计算增加10米(0.01公里)的行?

`-`是否也用于数据帧,有时使用引用调用?

层次树图的数据树

删除在R中的write.table()函数期间创建的附加行

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

按两个条件自动过滤数据

把代码写成dplyr中的group_by/摘要更简洁吗?

无法保存gglot的所有pdf元素

汇总数据:在跨越()all_of()Dynamic_list_of_vars=>;所选内容不能有缺失值的汇总()中出错

Data.table条件合并

有没有一种方法可以用非标准参数编写一个定制的ggploy主题函数?