将字符向量中的日期替换为特定格式

2024-01-29

我得到以下字符向量:

"On the evening of 2017-04-23, I was too tired"
"to complete my homework that was due on 24.04.2017."

我需要搜索它以查找所有出现的日期,并将其替换为“Monthname D, YYYY”格式。

我知道一般格式应该是 %B %d, %Y 并且我可能必须使用sub()功能,但我不太确定如何将两者结合在一起。

当我尝试类似的事情时

sub("[0-9]{2}.[0-9]{2}.[0-9]{4}","%B %d, %Y",x)

我刚刚得到以下结果

"On the evening of 2001-01-15, I was too tired to complete my homework that was due on %B %d, %Y."

有人可以帮我弄清楚如何将它们整合在一起吗?


在 stackoverflowers 的帮助下我的新代码如下:

streamlineDates(x)
{
#set pattern to dates in form of YYYY-MM-DD or DD.MM.YYYY
pattern <- "\\d{2,4}[.-]\\d{2}[.-]\\d{2,4}"

y <- c(x)

val <- unlist(regmatches(y, gregexpr(pattern, y)))

val1 <- as.Date(val,format=c("%Y-%m-%d","%d.%m.%Y"))
val2 <- format(val1,"%B %d, %Y")

y1 <- list()
for (i in 1:length(y)){
  y1[i] <- gsub(pattern,val2[i],y[i])
}
}

但是,当我仅输入:

x <- "to complete my homework that was due on 24.04.2017."

...它只返回 NA。我已将问题范围缩小到gsub哪里的替代品 value, “如果 NA,则结果中与匹配项对应的所有元素都将设置为 NA”。因此,由于仅输入最后一行时缺少第一个日期,因此仅返回 NA。

我怎样才能让它接受其中一个或两个日期?


第一种方法:

Using BASE R解决方案(不使用任何包):

pattern <- "\\d{2,4}[.-]\\d{2}[.-]\\d{2,4}"
rep <- c("On the evening of 2017-04-23, I was too tired","to complete my homework that was due on 24.04.2017.")


val <- unlist(regmatches(rep, gregexpr(pattern, rep)))

val1 <- as.Date(val,format=c("%Y-%m-%d","%d.%m.%Y"))
val2 <- format(val1,"%B %d, %Y")
val2
rep1 <- list()
for (i in 1:length(rep)){
rep1[i] <- gsub(pattern,val2[i],rep[i])
}

Answer:

do.call("c",rep1)

> do.call("c",rep1)                                                   
[1] "On the evening of April 23, 2017, I was too tired"      
[2] "to complete my homework that was due on April 24, 2017."
> 

第二种方法:

使用库stringr

library(stringr)
rep <- c("On the evening of 2017-04-23, I was too tired","to complete my homework that was due on 24.04.2017.")
val <- str_extract(rep,"\\d{2,4}[.-]\\d{2}[.-]\\d{2,4}")
val1 <- as.Date(val,format=c("%Y-%m-%d","%d.%m.%Y"))
val2 <- format(val1,"%B %d, %Y")
rep1 <- str_replace_all(rep,"\\d{2,4}[.-]\\d{2}[.-]\\d{2,4}",val2)
rep1

Answer:

> rep1
[1] "On the evening of April 23, 2017, I was too tired"      
[2] "to complete my homework that was due on April 24, 2017."
> 

编辑OP稍微改变了问题之后,解决方案更通用,但是假设月份始终位于中间,并且分隔符仅限于破折号(-)和点(.):

pattern <- "\\d{2,4}[.-]\\d{2}[.-]\\d{2,4}"
rep <- c("On the evening of 2017-04-23, I was too tired","to complete my homework that was due on 24.04.2017.")


val <- unlist(regmatches(rep, gregexpr(pattern, rep)))

year <- regmatches(val, gregexpr("\\d{4}", val))

month <- regmatches(val, gregexpr("(?<=[.-])\\d{1,2}(?=[.-])", val,perl=T))

date <- regmatches(val, gregexpr("(?<=[.-])\\d{2}$|^\\d{2}(?=[.-])", val,perl=T))
#Extracting year month and date , assuming month always falls in middle string

date1 <- paste0(year,"-",month,"-",date)
date1 <- as.Date(date1,"%Y-%m-%d")
val2 <- format(date1,"%B %d, %Y")

rep1 <- list()
for (i in 1:length(rep)){
  rep1[i] <- gsub(pattern,val2[i],rep[i])
}


do.call("c",rep1) 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符向量中的日期替换为特定格式 的相关文章

  • 如何根据 ggplot2 中的汇总数据创建堆积条形图

    我正在尝试使用 ggplot 2 创建堆积条形图 我的宽格式数据如下所示 每个单元格中的数字是响应的频率 activity yes no dontknow Social events 27 3 3 Academic skills works
  • 需要在R中跳过不同数量的行

    我正在使用以下代码来处理我的数据 但最近我意识到使用skip 27 在数据开始之前跳过存储在我的文件中的信息 不是一个好的选择 因为每个文件中要跳过的行数不同我的目标是读取存储在多个文件夹中的各种txt文件 并非所有文件都有相同的列数 列的
  • R 中 SVG 图形的最佳设备? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想从 R 导出 SVG 图形 似乎有两种选择 RSvgDevice 和 Cairo 有人可以对这些包发表评论吗 是默认的还是明显比另一个
  • 如何将旋转的 NetCDF 转换回正常的纬度/经度网格?

    我有一个带有旋转坐标的 NetCDF 文件 我需要将其转换为正常的纬度 经度坐标 经度为 180到180 纬度为 90到90 library ncdf4 nc open dat nf 对于尺寸 它显示 1 5 variables exclu
  • 更改 R 中 ggplot geom_polygon 的颜色方案

    我正在使用地图库和 ggplot 的 geom polygon 创建地图 我只是想将默认的蓝色 红色 紫色配色方案更改为其他颜色 我对 ggplot 非常陌生 所以如果我没有使用正确的数据类型 请原谅 我使用的数据如下所示 gt head
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复
  • 条件和分组 mutate dplyr

    假设我有以下每个抽屉库存增加的数据 gt socks year drawer nbr sock total 1990 1 2 1991 1 2 1990 2 3 1991 2 4 1990 3 2 1991 3 1 我想要一个二进制变量来标
  • 在 RGL 中将立方体绘制到 3D 散点图中

    我正在尝试向 3D 散点图添加较小的立方体 网格 具有指定边长 我希望立方体位于原点 我该怎么做呢 我已经玩过cube3d 但我似乎无法将立方体正确定位 也无法使其成为网格 因此我可以看到它包含的数据点 这是我所拥有的 library rg
  • ggplot2:带有 geom_line 的 x 轴因子不起作用

    我想要一个线图 其中value绘制为函数expt每级一行var 这是我的数据 lines lt expt var value 1 none p 0 183065327746799 2 none p 0 254234138384241 3 n
  • R 中的数据框操作 - 将单元格向左移动并删除 NA

    我有一个数据框 其列由随机分布的值和 NA 组成 如下所示 a lt c S E NA S NA b lt c A NA M G K c lt c I NA NA NA L meh lt dataframe a b c 1 2 3 4 5
  • 使用data.table进行聚合

    经过 SO 用户的多次建议后 我终于尝试将我的代码转换为使用data table library data table DT lt data table plate paste0 plate rep 1 2 each 5 id rep c
  • 更改绘图区域背景颜色

    我想使用我们公司的颜色在 R 中制作一个图表 这意味着所有图表的背景应为浅蓝色 但绘图区域应为白色 我正在寻找答案 发现绘制一个矩形就可以完成这项工作 几乎 然而 绘图区域现在是白色的 并且图形不再可见 这可能吗 getSymbols SP
  • 闪亮井板宽度

    library shiny library shinydashboard ui lt dashboardPage dashboardHeader dashboardSidebar dashboardBody wellPanel tags d
  • 如何根据多个条件创建列?

    我有一个数据框 我想根据多个条件创建一个列 v1 v2 v3 v4 v5 4 1 2 4 5 5 5 2 4 5 6 21 9 20 30 50 6 4 5 7 9 10 3 6 5 9 基本上 使用以下可能的值创建 v6 Cat dog
  • 如何在 foreach( ... , .packages="pkg") %dopar% 中指定 R 包的位置

    我的 包 安装在其他地方 我如何告诉 foreach 在哪里可以找到该包 foreach i 1 2 packages pkg dopar 这给我错误消息 worker initialization failed there is no p
  • rPlot 工具提示问题

    我有一个使用 rCharts 工具提示的简单示例 但似乎不起作用 set seed 1 test lt data frame x rnorm 100 y rnorm 100 rPlot y x data test type point to
  • 如何在 R 中 fork 进程

    我试图了解 R 多核包实现的分叉系统 包的例子是 p lt fork if inherits p masterProcess cat I m a child Sys getpid n exit I was a child cat I m t
  • 通过消除嵌套的 for 循环来改进此代码

    R 包corrplot除其他内容外 还包含这个漂亮的功能 cor mtest lt function mat conf level 0 95 mat lt as matrix mat n lt ncol mat p mat lt lowCI
  • 导入 .sav 时出现警告/错误

    我工作中有两个版本的 SPSS SPSS 11 在 Windows XP 上运行 SPSS 20 在 Linux 上运行 SPSS 的两个副本都工作正常 使用任一版本的 SPSS 创建的文件在其他版本的 SPSS 上打开时不会出现任何问题
  • 函数速度测试的奇怪结果

    我编写了一个使用递归来查找最大公因数 分母 的函数 gt gcd function a b if length a length b gt 1 warning Only scalars allowed using first element

随机推荐