Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将日期时间列拆分为日期和时间变量_R_Date_Datetime_Split - Fatal编程技术网

R 将日期时间列拆分为日期和时间变量

R 将日期时间列拆分为日期和时间变量,r,date,datetime,split,R,Date,Datetime,Split,我有一个格式为“Y-m-d H:m:S”的“日期时间列”开始。我想将此列拆分为“日期”列和“时间”列 我尝试了以下方法: df$Date <- sapply(strsplit(as.character(df$Start), " "), "[", 1) df$Time <- sapply(strsplit(as.character(df$Start), " "), "[", 2) 所以现在我只需要知道如何

我有一个格式为“Y-m-d H:m:S”的“日期时间列”开始。我想将此列拆分为“日期”列和“时间”列

我尝试了以下方法:

df$Date <- sapply(strsplit(as.character(df$Start), " "), "[", 1)
df$Time <- sapply(strsplit(as.character(df$Start), " "), "[", 2)
所以现在我只需要知道如何将时间和日期从
因子
转换为'time'和'date'。

怎么样

df$Date <- as.Date(df$Start)

df$Time <- format(df$Start,"%H:%M:%S")

df$Date您可能更喜欢这样做,避免使用实际上并不必要的
lappy
循环(但这也不是一件坏事!)

#如果我们有这些数据。。。

df
df$Date通过查看列格式,我认为您可以使用as.POSIXct正确设置列格式,然后使用format()提取所需的数据

这是我在拆分DateTime列时使用的代码

df$Time <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%H:%M:%S")

df$Date <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%Y:%m:%d")

df$Time假设您的数据与此类似,有一列
datetime
和许多其他列

df <- data.frame(a = 1:5, datetime = as.POSIXct(c('2019-02-01 01:00:00', 
                 '2019-02-01 02:00:00', '2019-02-01 03:00:00', 
                 '2019-02-01 04:00:00', '2019-02-01 05:00:00')))

df
#  a            datetime
#1 1 2019-02-01 01:00:00
#2 2 2019-02-01 02:00:00
#3 3 2019-02-01 03:00:00
#4 4 2019-02-01 04:00:00
#5 5 2019-02-01 05:00:00

如果我们想保留原始列(
datetime
),我们可以添加
remove=FALSE

,您可以在这个方法中使用它。它工作得很好

format(mdy(df_5star$Date4)

希望有帮助

如果您对非
base
备选方案持开放态度,您可以使用
data.table::IDateTime

接受日期-时间输入,并返回包含日期和时间列的数据表

…分别属于
IDate
*和
ITime
**类:

x = as.POSIXct("2013-09-01 08:07:41") + 0:2
IDateTime(x)
#         idate    itime
# 1: 2013-09-01 08:07:41
# 2: 2013-09-01 08:07:42
# 3: 2013-09-01 08:07:43

*
IDate
是从
date
派生的日期类。它的内部表示形式与
Date
类相同,只是存储模式为整数

**
ITime
是一个时间类,存储为一天中的整数秒数


使用
sapply
而不是
lapply
。当
sapply
遇到一个“常规”结果时,它返回一个向量或矩阵
lappy
总是运行一个列表。就是这样!谢谢!这给了我这个错误..:格式错误。默认值(结构为.character(x),names=names(x),dim=dim(x),:无效的'trim'参数如果您有df$Start类型为“character”,它不是时间戳。请使用类()要检查的函数。在应用上述函数之前,您应该将字符串转换为时间戳。谢谢,R将其作为一个因子来读取。我已经得到了一个包含日期的列,实际上该列的类为“Date”。但是,现在我正在与时间作斗争。我使用了:df$time strtime(as.character(df$Start),%Y-%m-%d%H:%m:%S)?尝试过这个,但现在它给我一个错误,即“参数‘格式’丢失,没有默认值”。。这似乎不起作用,但可能是因为R将其作为一个因子读入。谢谢!@JalouHuntjens
as。character
应该解决这个问题。我示例中的数据也是
因子
。您可以添加
str吗(df)
到OP,这样我就可以看到它是什么样子了?@JalouHuntjens在你的数据上运行我的代码时出现了什么错误?它应该可以工作。它只会给我一个列表,其中包含以下内容:5259 48.88 1 13740310 2013-09-04 08:14:11.000。如果我使用str()然后它仍然将其视为一个因素,而且它不会分割行。我不知道我做错了什么。无论如何,非常感谢您的帮助!这可能需要更多的帮助才能成为一个好答案。问题要求同时创建日期列和时间列,但此答案只创建一个。此外,您缺少了一个
,当使用base R中未包含的函数时(如
mdy()
),您应该提到所需的包(
lubridate
)。
df <- data.frame(a = 1:5, datetime = as.POSIXct(c('2019-02-01 01:00:00', 
                 '2019-02-01 02:00:00', '2019-02-01 03:00:00', 
                 '2019-02-01 04:00:00', '2019-02-01 05:00:00')))

df
#  a            datetime
#1 1 2019-02-01 01:00:00
#2 2 2019-02-01 02:00:00
#3 3 2019-02-01 03:00:00
#4 4 2019-02-01 04:00:00
#5 5 2019-02-01 05:00:00
tidyr::separate(df, datetime, c("date", "time"), sep = " ")
#  a       date     time
#1 1 2019-02-01 01:00:00
#2 2 2019-02-01 02:00:00
#3 3 2019-02-01 03:00:00
#4 4 2019-02-01 04:00:00
#5 5 2019-02-01 05:00:00
format(mdy(df_5star$Date4)
x = as.POSIXct("2013-09-01 08:07:41") + 0:2
IDateTime(x)
#         idate    itime
# 1: 2013-09-01 08:07:41
# 2: 2013-09-01 08:07:42
# 3: 2013-09-01 08:07:43