使用Lubridate软件包将军事时间转换为标准时间(指示AM / PM)

时间:2019-04-18 13:13:08

标签: r lubridate

我正在尝试将属于数据帧一部分的列从军事时间转换为标准时间。我还要指出AM / PM。我正在尝试在R的lubridate软件包的功能范围内进行此操作。

从另一个名为“ df”的数据框架中,我使用以下代码创建了一个名为“ out”的新数据框架:

out <- df %>% mutate(NewDate = parse_date_time(CreatedDate, orders = "mdy IMS p")) %>%
  select(CreatedDate, NewDate) 

我正在使用mutate函数操作的“ df”列(称为“ CreatedDate”)具有如下所示的单元格:

01/01/2019 02:12:37 PM
01/01/2019 10:37:57 PM
01/02/2014 05:10:35 AM

我已经操纵了该列以生成名为“ NewDate”的新列,如下所示:

2018-04-12 11:11:26
2018-11-13 13:06:56
2018-04-16 05:30:13

我正在尝试使“ NewDate”列标准化,但要按常规时间包含AM / PM名称,就像在应用parse_date_time函数之前所做的那样。

我希望,通过在我的parse_date_time函数中包含“ mdy IMS p”,我将在NewDate列中生成如下内容:

2018-04-12 11:11:26 AM
2018-11-13 01:06:56 PM
2018-04-16 05:30:13 AM

2 个答案:

答案 0 :(得分:4)

您可以使用format在基数R中完成

date_time <- as.POSIXct("2018-04-12 21:11:26")
format(date_time, "%Y-%m-%d %I:%M:%S %p")

# [1] "2018-04-12 09:11:26 PM"

%Y-4位数字年份

%m-十进制月份

%d-十进制日期

%H-十进制小时(24小时)

%I-十进制小时(12小时)

%M-十进制分钟

%S-十进制秒

%p-上午/下午

答案 1 :(得分:0)

如果要使用lubridate来保持一致性并与代码的其他方面一起使用,则可以使用与orders参数中张贴的@Jav相同的代码。如果日期格式不一致,这将很有帮助。如果有些是军方的,有些是AM / PM格式的,则可以执行以下操作:

df <- data.frame(CreatedDate = c("01/01/2019 02:12:37 PM",
                                 "01/11/2019 06:12:37 PM",
                                 "01/01/19 10:37:57 PM",
                                  "2019-01-02 21:17:12"),
                 stringsAsFactors = FALSE)

您会看到所有混合格式,这很罕见。

out <- df %>%
  mutate(NewDate = parse_date_time(CreatedDate, 
                                   orders = c("%m/%d/%Y %I:%M:%S %p", 
                                              "%m/%d/%y %I:%M:%S %p",
                                              "%Y-%m-%d %H:%M:%S"))) %>%
           dplyr::select(CreatedDate, NewDate)

最终结果应该是格式一致的新日期,如下所示:

             CreatedDate             NewDate
1 01/01/2019 02:12:37 PM 2019-01-01 14:12:37
2 01/11/2019 06:12:37 PM 2019-01-11 18:12:37
3   01/01/19 10:37:57 PM 2019-01-01 22:37:57
4    2019-01-02 21:17:12 2019-01-02 21:17:12