如何在不四舍五入的情况下将日期时间转换为 R 中的日期?
How to convert a datetime to date in R, WITHOUT rounding the day?
我正在使用 R 并尝试将日期时间字段转换为日期? R 给了我想要的格式,但不断对一些日期值进行四舍五入。特别是中午 12 点之后的一切!我找不到任何解决这个确切问题的线程。我实际上找到了 a 解决方案,但想 post 这个问题,因为我花了整整一周的时间进行故障排除。
#Convert the datetime field from character to a datetime
main_df$datetime <- strptime(main_df$ï..Date, format = "%m/%d/%Y %H:%M")
main_df$datetime <- as.POSIXct(main_df$datetime, tz = Sys.timezone())
head(main_df$datetime)
class(main_df$datetime)
#Remove the poorly computer-titled character field that contained datetime info
main_df <- subset(main_df, select = -c(ï..Date))
#Use the NEW datetime field to create a date field
#main_df$Date <- trunc(main_df$datetime,"days")
main_df$Date <- as.Date(main_df$datetime, format = "%m/%d/%Y")
?as.Date()
class(main_df$Date)
head(main_df$Date)
返回:
head(main_df$datetime)
[1] "2020-05-16 00:31:00 CDT" "2020-05-16 00:30:00 CDT" "2020-05-15 23:33:00 CDT" "2020-05-15 15:33:00 CDT"
[5] "2020-05-15 22:31:00 CDT" "2020-05-15 22:12:00 CDT"
和
> class(main_df$Date)
[1] "Date"
>
> head(main_df$Date)
[1] "2020-05-16" "2020-05-16" "2020-05-16" "2020-05-15" "2020-05-16" "2020-05-16"
请注意 'Date' 的最后 4 个值应该是 2020-05-15,但它们被转换为 2020-05-16。那么还有什么其他方法可以解决这个问题呢?我打算 post 一种可行的方法,但我怀疑它是最干净的。
如果我们不想使用'time',则使用正则表达式匹配space后跟其他字符(" .*"
),替换为空白sub
然后转换为Date
class。转换为 DateTime 的问题是有时 "23:33:00"
会使其转换为第二天
main_df$Date <- as.Date(sub(" .*", "", main_df$datetime), format = "%m/%d/%Y")
您输入的日期是否包含时区规范?如果不是,则它们是不明确的,四舍五入可能是正确的,也可能是错误的。如果它们包含时区规范,lubridate
包应该能正确处理它们。
我建议不要使用 tz = Sys.timezone()
,因为如果您的输入不包含时区规范,那么输入数据和算法之间的交互将取决于地理位置,因此适合您的方法可能不适用于不同位置的不同用户。
我正在使用 R 并尝试将日期时间字段转换为日期? R 给了我想要的格式,但不断对一些日期值进行四舍五入。特别是中午 12 点之后的一切!我找不到任何解决这个确切问题的线程。我实际上找到了 a 解决方案,但想 post 这个问题,因为我花了整整一周的时间进行故障排除。
#Convert the datetime field from character to a datetime
main_df$datetime <- strptime(main_df$ï..Date, format = "%m/%d/%Y %H:%M")
main_df$datetime <- as.POSIXct(main_df$datetime, tz = Sys.timezone())
head(main_df$datetime)
class(main_df$datetime)
#Remove the poorly computer-titled character field that contained datetime info
main_df <- subset(main_df, select = -c(ï..Date))
#Use the NEW datetime field to create a date field
#main_df$Date <- trunc(main_df$datetime,"days")
main_df$Date <- as.Date(main_df$datetime, format = "%m/%d/%Y")
?as.Date()
class(main_df$Date)
head(main_df$Date)
返回:
head(main_df$datetime)
[1] "2020-05-16 00:31:00 CDT" "2020-05-16 00:30:00 CDT" "2020-05-15 23:33:00 CDT" "2020-05-15 15:33:00 CDT"
[5] "2020-05-15 22:31:00 CDT" "2020-05-15 22:12:00 CDT"
和
> class(main_df$Date)
[1] "Date"
>
> head(main_df$Date)
[1] "2020-05-16" "2020-05-16" "2020-05-16" "2020-05-15" "2020-05-16" "2020-05-16"
请注意 'Date' 的最后 4 个值应该是 2020-05-15,但它们被转换为 2020-05-16。那么还有什么其他方法可以解决这个问题呢?我打算 post 一种可行的方法,但我怀疑它是最干净的。
如果我们不想使用'time',则使用正则表达式匹配space后跟其他字符(" .*"
),替换为空白sub
然后转换为Date
class。转换为 DateTime 的问题是有时 "23:33:00"
会使其转换为第二天
main_df$Date <- as.Date(sub(" .*", "", main_df$datetime), format = "%m/%d/%Y")
您输入的日期是否包含时区规范?如果不是,则它们是不明确的,四舍五入可能是正确的,也可能是错误的。如果它们包含时区规范,lubridate
包应该能正确处理它们。
我建议不要使用 tz = Sys.timezone()
,因为如果您的输入不包含时区规范,那么输入数据和算法之间的交互将取决于地理位置,因此适合您的方法可能不适用于不同位置的不同用户。