使用as.POSIXct转换日期时间出现显示差异的技术咨询
POSIXct转换后显示差异的原因与解析
一、为什么两列显示格式不一样?
- POSIXct是R中存储日期时间的数值型类型(本质是记录从1970-01-01 UTC到目标时间的秒数),它的显示格式由R自动判断:如果某列所有记录的时分秒都是
00:00:00,R会自动简化为仅日期的格式(YYYY-MM-DD);只要有一条记录的时分秒非0,整列就会显示完整的日期时间(YYYY-MM-DD HH:MM:SS)。你的sleep$SleepDay应该是所有行的时分秒都为0,而intensity$ActivityHour里存在时分秒非0的记录。 - 你指定的
format参数是用来告诉R如何解析输入的字符型日期字符串,并非设置转换后的显示格式。转换后的显示规则和输入格式无关,完全由R的默认逻辑决定。
二、as.POSIXct的转换全过程
- 解析输入字符串:R按照你给定的
"%m/%d/%Y %I:%M:%S %p"格式,逐个识别字符中的月、日、年、12小时制的小时、分、秒,以及AM/PM标记,把字符串转换成对应的日期时间信息。 - 生成时间戳:将解析出的日期时间转换为POSIXct的底层存储形式——从1970-01-01 UTC到该时间的总秒数,同时应用你指定的时区
tz=Sys.timezone()。 - 自动格式化显示:转换完成后,R检查整列的时分秒信息,根据是否全为0来决定显示简化日期还是完整日期时间。
三、如何让两列显示格式统一?
如果想强制两列都显示完整的日期时间,有两种可选方式:
- 转为字符型显示(简单直接,但会丢失POSIXct类型):
sleep$SleepDay <- format(as.POSIXct(sleep$SleepDay, format="%m/%d/%Y %I:%M:%S %p", tz=Sys.timezone()), format="%Y-%m-%d %H:%M:%S")
- 保持POSIXct类型同时自定义显示:
# 先解析再格式化,最后转回POSIXct sleep$SleepDay <- as.POSIXct( strftime(as.POSIXct(sleep$SleepDay, format="%m/%d/%Y %I:%M:%S %p", tz=Sys.timezone()), format="%Y-%m-%d %H:%M:%S"), tz=Sys.timezone() ) # 或者设置全局显示选项,让所有POSIXct都显示完整格式 options(dates="%Y-%m-%d %H:%M:%S")
内容的提问来源于stack exchange,提问作者Sadredin Mahmoudi
相关产品推荐
相关产品推荐

