【问题标题】:Convert numeric time format to POSIXlt将数字时间格式转换为 POSIXlt
【发布时间】:2017-12-08 13:49:56
【问题描述】:

我有时间从文件中导入。该列被视为数字,如下所示:

head(RawData$TimeStart, 10) [1] 0.00 0.00 0.00 30.19 0.00 25.00 0.00 9.20 0.00 0.00

此数据表示例如在 0.0 分钟和 30 分钟 19 秒 (30.19) 采集的样本。

我希望现在将此列转换为以下格式:

> head(RawData$Converted, 10)
 [1] "2017-07-05 00:00:00 AEST" "2017-07-05 00:00:00 AEST" "2017-07-05 00:00:00 AEST" "2017-07-05 00:30:19 AEST"
 [5] "2017-07-05 00:00:00 AEST" "2017-07-05 00:25:00 AEST" "2017-07-05 00:00:00 AEST" "2017-07-05 00:09:20 AEST"
 [9] "2017-07-05 00:00:00 AEST" "2017-07-05 00:00:00 AEST"

我尝试了以下方法: RawData$Converted <- as.POSIXct(RawData$TimeStart, origin='1970-01-01', tz='Australia/Darwin')

但这并没有给出今天的日期/时间。我很困惑,所以任何帮助将不胜感激。

【问题讨论】:

  • 那是小时.分钟吗?
  • 0.00 = 午夜过后 7 秒?我认为您要么没有向我们展示足够的小数,要么您的预期结果是错误的。顺便说一句,您显示的是head(TimeStart),然后是head(TimeEnd) - 这是故意的吗?
  • 这是 minute.second - 格式来自另一个导入的来源,而不是我自己的! AnalysedData$TimeEnd 列不是我想要的输出,更多我想要与该列相同的格式 - 正如我上面所说的那样。
  • 试试.POSIXct(86400*v1, tz = 'Australia/Darwin')
  • 谢谢,但不幸的是,根据我其他专栏的格式,日期仍然是 1970-01-01 而不是今天。

标签: r datetime posixlt


【解决方案1】:

打破你的数值以将它们全部转换为秒,并将其添加到今天的日期时间:

x <- c(0.00,0.00,0.00,30.19,0.00,25.00,0.00,9.20,0.00,0.00)
as.POSIXct(format(Sys.Date()), tz="Australia/Darwin") + (floor(x)*60) + ((x-floor(x))*100)
# [1] "2017-07-05 00:00:00 ACST" "2017-07-05 00:00:00 ACST" "2017-07-05 00:00:00 ACST" "2017-07-05 00:30:19 ACST"
# [5] "2017-07-05 00:00:00 ACST" "2017-07-05 00:25:00 ACST" "2017-07-05 00:00:00 ACST" "2017-07-05 00:09:20 ACST"
# [9] "2017-07-05 00:00:00 ACST" "2017-07-05 00:00:00 ACST"

这是在达尔文时代,ACST 而不是 AEST,但我猜这就是你想要的。

【讨论】:

  • 非常感谢!如果我想要 AEST 而不是 ACST?
  • 查看OlsonNames()了解所有可能的时区
  • @user2716568 - 只需明确指定您的时区 - tz="Australia/Brisbane"tz="Australia/Sydney" - 只需确保您当时没有处理夏令时。如果我不需要考虑夏令时,我通常在tz="UTC" 工作。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多