R从半标准字符串中提取时间分量

2023-11-26

Setup

我有一列持续时间作为字符串存储在数据框中。我想将它们转换为适当的时间对象,可能POSIXlt。大多数字符串都很容易使用解析这个方法:

> data <- data.frame(time.string = c(
+   "1 d 2 h 3 m 4 s",
+   "10 d 20 h 30 m 40 s",
+   "--"))
> data$time.span <- strptime(data$time.string, "%j d %H h %M m %S s")
> data$time.span
[1] "2012-01-01 02:03:04" "2012-01-10 20:30:40" NA

缺失的持续时间已编码"--"并需要转换为NA- 这已经发生但应该保留。

挑战在于字符串删除零值元素。因此期望值2012-01-01 02:00:14将是字符串"1 d 2 h 14 s"。然而这个字符串解析为NA使用简单的解析器:

> data2 <- data.frame(time.string = c(
+  "1 d 2 h 14 s",
+  "10 d 20 h 30 m 40 s",
+  "--"))
> data2$time.span <- strptime(data2$time.string, "%j d %H h %M m %S s")
> data2$time.span
[1] NA "2012-01-10 20:30:40" NA

问题

  1. 处理所有可能的字符串格式的“R Way”是什么?也许单独测试并提取每个元素,然后重新组合?
  2. POSIXlt 是正确的目标类吗?我需要不受任何特定开始时间影响的持续时间,因此添加错误的年份和月份数据(2012-01-)令人烦恼。

Solution

@mplourde 绝对有正确的想法,基于测试日期格式中的各种条件来动态创建格式化字符串。添加的cut(Sys.Date(), breaks='years')作为基准datediff也很好,但未能解释一个关键的怪癖as.POSIXct() 注意:我使用的是R2.11基础,这可能已在更高版本中修复.

的输出as.POSIXct()根据是否包含日期部分而发生显着变化:

> x <- "1 d 1 h 14 m 1 s"
> y <-     "1 h 14 m 1 s"  # Same string, no date component
> format (x)  # as specified below
[1] "%j d %H h %M m %S s"
> format (y)
[1] "% H h % M %S s"    
> as.POSIXct(x,format=format)  # Including the date baselines at year start
[1] "2012-01-01 01:14:01 EST"
> as.POSIXct(y,format=format)  # Excluding the date baselines at today start
[1] "2012-06-26 01:14:01 EDT"

因此,第二个论点difftime函数应该是:

  • 如果输入字符串,则为当年第一天的开始has一天的组成部分
  • 的开始current如果输入字符串则为天does not有一天的组成部分

这可以通过更改单位参数来实现cut功能:

parse.time <- function (x) {
  x <- as.character (x)
  break.unit <- ifelse(grepl("d",x),"years","days")  # chooses cut() unit
  format <- paste(c(if (grepl("d", x)) "%j d",
                    if (grepl("h", x)) "%H h",
                    if (grepl("m", x)) "%M m",
                    if (grepl("s", x)) "%S s"), collapse=" ")

  if (nchar(format) > 0) {
    difftime(as.POSIXct(x, format=format), 
             cut(Sys.Date(), breaks=break.unit),
             units="hours")
  } else {NA}

}

difftime对象是持续时间对象,可以添加到POSIXct or POSIXlt对象。也许你想用这个而不是POSIXlt?

关于从字符串到时间对象的转换,你可以这样做:

data <- data.frame(time.string = c(
    "1 d 1 h",
    "30 m 10 s",
    "1 d 2 h 3 m 4 s",
    "2 h 3 m 4 s",
    "10 d 20 h 30 m 40 s",
    "--"))

f <- function(x) {
    x <- as.character(x)
    format <- paste(c(if (grepl('d', x)) '%j d',
                      if (grepl('h', x)) '%H h',
                      if (grepl('m', x)) '%M m',
                      if (grepl('s', x)) '%S s'), collapse=' ')

    if (nchar(format) > 0) {
        if (grepl('%j d', format)) {
            # '%j 1' is day 0. We add a day so that x = '1 d' means 24hrs.
            difftime(as.POSIXct(x, format=format) + as.difftime(1, units='days'), 
                    cut(Sys.Date(), breaks='years'),
                    units='hours')
        } else {
            as.difftime(x, format, units='hours')
        }
    } else { NA }
}

data$time.span <- sapply(data$time.string, FUN=f)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R从半标准字符串中提取时间分量 的相关文章

  • numpy.histogram 的 hist 维度,密度 = True

    假设我有这个数组 A array 0 0019879 0 00172861 0 00527226 0 00639585 0 00242005 0 00717373 0 00371651 0 00164218 0 00034572 0 008
  • 如何从 R 运行带有特定模块的 perl 脚本?

    我可以从终端运行 perl 脚本 myperlscript pl 没有任何问题 但是 如果我尝试从 RStudio 中运行相同的 perl 脚本 则会出现以下错误 command lt myperlscript pl outputfile
  • 在shiny中过滤传单地图数据

    我在用传单地图设置这个闪亮的东西时遇到了麻烦 我的原帖 https stackoverflow com questions 50111566 applying leaflet map bounds to filter data within
  • 如何在 Perl 中使用 use strict 一次一行处理多行字符串?

    我正在尝试找出 PBP 批准的正确方法来一次一行处理多行字符串 许多 Perl 编码人员建议将多行字符串视为文件句柄 除非您在脚本中使用 use strict 否则它可以正常工作 然后 您会收到编译器发出的警告 提示在使用严格引用时无法使用
  • 纵向序列数据的三次样条方法?

    我有一个串行数据 格式如下 time milk Animal ID 30 25 6 1 31 27 2 1 32 24 4 1 33 17 4 1 34 33 6 1 35 25 4 1 33 29 4 2 34 25 4 2 35 24
  • 使用 pracma::findpeaks 识别持续峰值

    我的语法有问题peakpat内的选项findpeaks内的函数pramcaR 包 v 2 1 1 我使用的是 R 3 4 3 x64 Windows 我希望该函数能够识别可能有两个重复值的峰值 并且我相信该选项peakpat这就是我能做到的
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • twitterR 和 ROAuth R 软件包安装

    我在安装 CRAN 上的 twitteR 和 RAOuth 软件包时遇到一些问题 我尝试了几种不同的方法 在 Windows 下使用源代码 在 Ubuntu 下使用 RStudio 我尝试了以下命令 sudo apt get install
  • 在 HTML5 Javascript 中将 BlobBuilder 转换为字符串

    function blobToString blob var reader new FileReader var d reader onloadend function d callback reader result console lo
  • R独特的列或行与NA无可比拟

    有谁知道如果incomparables的论证unique or duplicated 曾经被实施过incomparables FALSE 也许我不明白它应该如何工作 无论如何 我正在寻找一个巧妙的解决方案 以仅保留与另一列相同的唯一列 或行
  • 为什么 dplyr filter() 不能在函数内工作(即使用变量作为列名)?

    使用 dplyr 函数对数据进行过滤 分组和变异的函数 基本管道序列在函数之外工作得很好 这就是我使用真实列名称的地方 将其放入一个函数中 其中列名称是一个变量 并且某些函数可以工作 但有些函数则不能 尤其是 dplyr filter 例如
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 只读取选定的列

    谁能告诉我如何仅读取下面每年数据的前 6 个月 7 列 例如使用read table Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2009 41 27 25 31 31 39 2
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 基于时间窗口的不规则时间序列的优化滚动函数

    有没有办法使用 rollapply 来自zoo包或类似的东西 优化功能 rollmean rollmedian等 使用基于时间的窗口计算滚动函数 而不是基于大量观察的函数 我想要的很简单 对于不规则时间序列中的每个元素 我想计算一个具有 N
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use
  • 文本挖掘 pdf 文件/词频问题

    我正在尝试挖掘一篇具有丰富 pdf 编码和图表的文章的 pdf 我注意到 当我挖掘一些 pdf 文档时 我得到的高频词是 phi taeoe toe sigma gamma 等 它与某些 pdf 文档配合良好 但与其他文档配合使用时却得到这
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集

随机推荐

  • Xamarin Forms共享首选项交叉

    我想知道以跨平台方式操作应用程序设置的最佳解决方案是什么 在 iOS 中 我们可以在设置屏幕中更改应用程序外部的设置 但在 Windows Phone 和 Android 中则没有此功能 因此 我的想法是在应用程序内创建一个普通页面 屏幕
  • 用于开发 Flash 应用程序的最佳开源工具是什么?最好从哪些地方开始学习? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 就工具而言 我知道Haxe MTASC and swfmill 您能提供与其中任何一个相关的成功或恐怖故事吗 还有其他我应该调查的吗 在学习方面 Adobe 开发人员连接似乎包含不错的参考
  • 如何在 Three.js 中使用 gltf 模型投射阴影?

    嘿 我是三个 js 的新手 想知道如何用 gltf 模型投射阴影 我可以看到这是可能的 因为它正在工作here我假设我没有正确构建我的代码 var model new THREE GLTFLoader model load https th
  • Android Studio 测试显示测试结果 0/0。我怎样才能开始测试?

    我正在 Android Studio 中学习 Kotlin 初学者课程 在测试阶段 检测结果总是0 0 我怎样才能完成这些测试 代码由 Google Android 开发人员编写 应该可以完美运行 我用的是同样的 应用程序编译没有错误 代码
  • 应用程序特定的权限设置不授予本地激活权限

    我的一位同事建议我可以在 GPO 中修复此错误 它是 Windows 2016 服务器 The application specific permission settings do not grant Local Activation p
  • 画布不在自定义视图中绘制

    我创建了一个自定义视图 CircleView 如下所示 public class CircleView extends LinearLayout Paint paint1 public CircleView Context context
  • 停止从 selenium webdriver 加载浏览器

    我的 selenium webdriver 转到一个页面并等待该页面完成加载 如果超过 30 秒 则会超时并且脚本失败 有没有办法让网络驱动程序在 30 秒后停止页面加载 比如按浏览器上的 x 这将防止我的驱动程序超时 我正在使用 Chro
  • 将文件发送到回收站

    目前我正在使用以下功能 file Delete 但是如何使用此函数将文件发送到回收站而不是直接删除它呢 Use 文件系统 删除文件并指定正确的回收选项 虽然这适用于 UI 交互式应用程序 但它不适用于非 UI 交互式应用程序 例如 Wind
  • 在类定义之外定义方法?

    class MyClass def myFunc self pass 我可以创建吗MyFunc 在类定义之外 甚至可能在另一个模块中 是的 您可以在类外部定义函数 然后在类主体中将其用作方法 def func self print func
  • Spring-boot调度器在没有@EnableScheduling注解的情况下运行

    我按照此示例在示例项目中创建计划任务 https spring io guides gs scheduling tasks 它说 EnableScheduling ensures that a background task executo
  • ChromeOptions 使用 Selenium ChromeDriver for node.js 导致引用错误

    我正在尝试使用 Selenium 的 ChromeDriver 驱动程序来使用 Chrome 运行一些测试 但是当我使用时出现引用错误ChromeOptions My Code 我想强制使用某些选项 例如针对特定的用户配置文件进行测试 基于
  • 八度向量解包

    Octave matlab 用于处理多个返回值的表示法 a b f x 表明 f x 返回的值是一种行向量 并且 Octave 支持向量解包 就像 Python 的元组解包 然而当我把 a b 1 2 I get 错误 常量表达式的输出参数
  • PHP 脚本被杀死且没有任何解释

    我按以下方式启动我的 php 脚本 bash cd path php f scriptname php php 脚本运行时没有任何输出 一段时间后 php 脚本响应 Killed 我的想法是它达到了内存限制 ini set memory l
  • 实体框架 6:检测关系变化

    在我的 DbContext 子类中 我重写了 SaveChanges 方法 因此我可以实现一种类似触发器的功能 在实际保存更改之前 现在 在其中一些触发器中 有必要检测某些关系是否发生了变化 无论是多对多 一对一 零等 我在互联网上阅读了许
  • 使用 GROUP BY 检索满足条件的记录

    我现在只想从几千条记录中选择计数大于 1 的行 换句话说 重复项 我主要看到的是 1 和一些 2 和 3 SELECT count AS Number GI FROM GeneralInformation AS GI GROUP BY Fi
  • 如何在 Android 客户端获取订阅的到期日期?

    我们正在 Android 中使用应用内购买来实现订阅 我们正在获取如下格式的购买时间戳 orderId GPA 1234 5678 9012 34567 packageName com example app productId examp
  • ASP.NET Core 标记帮助器,用于有条件地将类添加到元素

    在Asp Net MVC中 我们可以有条件地添加类 如下代码 div class div 如何通过使用 tagHelper 并删除条件中的其他部分来做到这一点 能够按照 tagHelper 提供的方式添加条件 css 类 此代码类似于 An
  • iOS 5 UINavigationBar 删除子视图(图像子视图)删除导航栏

    在我的应用程序中 在 iOS 4 上运行良好的导航栏从 iOS 5 开始消失了 这是我认为引起问题的原因 我正在删除 RootViewController viewWillAppear 方法中的子视图 for UIView view in
  • 芹菜、昆布和 django - 导入错误

    我正在使用 django 运行一个应用程序 我想使用 celery 来制作一些计划任务 根据官方文档 在我的 settings py 文件中 我设置了代理传输 BROKER URL django 并将 kombu transport dja
  • R从半标准字符串中提取时间分量

    Setup 我有一列持续时间作为字符串存储在数据框中 我想将它们转换为适当的时间对象 可能POSIXlt 大多数字符串都很容易使用解析这个方法 gt data lt data frame time string c 1 d 2 h 3 m