gpt4 book ai didi

r - 将字符串直接转换为 IDateTime

转载 作者:行者123 更新时间:2023-12-03 03:23:49 27 4
gpt4 key购买 nike

我正在使用新版本的data.table,尤其是很棒的fread函数。我的文件包含作为字符串加载的日期(因为我不知道该怎么做),看起来像 01APR2008:09:00:00

我需要对这些日期时间上的 data.table 进行排序,然后使排序能够有效地以 IDateTime 格式(或其他我还不知道的格式)进行转换。

> strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")
[1] "2008-04-01 09:00:00"

> IDateTime(strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S"))
idate itime
1: 2008-04-01 09:00:00

> IDateTime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")
Error in charToDate(x) :
character string is not in a standard unambiguous format

看起来我无法执行 DT[ , newType := IDateTime(strptime(oldType, "%d%b%Y:%H:%M:%S"))]

我的问题是:

  1. 有没有办法从 fread 直接转换为 IDateTime,以便我可以高效地进行排序?
  2. 如果没有,知道我希望能够按此日期时间列对 DT 进行排序的最有效方法是什么

最佳答案

不幸的是(为了提高效率)strptime 生成一个 POSIXlt 类型,该类型不受 data.table 支持,并且始终会由于其大小(每个日期 40 字节!)而受到影响结构。尽管 strftime 产生了更好的 POSIXct,但它仍然通过 POSIXlt 来实现。更多信息在这里:

http://stackoverflow.com/a/12788992/403310

查看诸如as.Date之类的基本函数,它也使用strptime,从纪元(奇怪地)存储为 double 创建一个整数偏移量。 data.table 中的 IDate (和 friend )类旨在实现存储为整数纪元偏移量。适合通过 base::sort.list(method = "radix") 进行快速排序(这实际上是一种计数排序)。 IDate 的真正目标并不是快速(通常是一次性)转换。

因此,为了转换字符串日期/时间,无论正确还是错误,我倾向于推出自己的辅助函数。

如果字符串日期是"2012-12-24"我倾向于:as.integer(gsub("-", "", col)) 并继续使用 YYYYMMDD 整数日期。同样,时间可以是 HHMMMDD 作为整数。如果您通常希望在一天内滚动,而不是前一天,则两列:datetime 可能会很有用。按月分组既简单又快速:by = date %/% 100L。添加和减去天数很麻烦,但无论如何,因为您很少想添加日历日,而是添加工作日或工作日。因此,无论如何,这都是对您的工作日向量的查找。

在您的情况下,字符月份需要转换为 1:12。您的日期“01APR2008”中没有分隔符,因此 substring 是一种方式,后跟月份的 matchfmatch姓名。您可以控制文件格式吗?如果是这样,数字最好采用自然排序的明确格式,例如 %Y-%m-%d%Y%m%d

我还没有知道如何在 fread 中最好地做到这一点,因此日期/时间目前保留为字符,因为我还不确定如何检测日期格式或哪种类型输出。但它确实需要输出整数或 double 日期,而不是低效的字符。我怀疑我对 YYYYMMDD 整数的使用被视为非常规,所以我有点犹豫是否将其设为默认值。它们有自己的位置,并且基于纪元的日期也有优点和缺点。我建议的只是日期不必始终基于纪元。

你觉得怎么样?顺便说一句,感谢您对 fread 的鼓励;很高兴看到。

关于r - 将字符串直接转换为 IDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056370/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com