2014-09-21 96 views
5

我的問題來自this question。問題有以下字符串。將chr「00:00:00」轉換爲日期時間「00:00:00」

x <- "2007-02-01 00:00:00" 
y <- "02/01/2007 00:06:10" 

如果您嘗試將此字符串轉換爲日期類對象,會發生一些有趣的事情。

這是@ nrusell的回答的一個示例。

as.POSIXct(x,tz=Sys.timezone()) 
[1] "2007-02-01 EST" 

as.POSIXct(y,format="%m/%d/%Y %H:%M:%S",tz=Sys.timezone()) 
[1] "2007-02-01 00:06:10 EST" 

如您所見,00:00:00從第一個示例中消失。 @Richard Scriven在我們的討論中使用lubridate留下了下面的例子。

dt <- as.POSIXct("2007-02-01 00:00:00") 
hour(dt) <- hour(dt)+1 
dt 
[1] "2007-02-01 01:00:00 EST" 
hour(dt) <- hour(dt)-1 
dt 
[1] "2007-02-01 EST" 

再一次,00:00:00消失。爲什麼R在轉換後避免在日期類對象中保留00:00:00?我們如何保持00:00:00

+0

什麼是更奇怪的是,如果你做'n < - now()',然後使用'hou r <-','minute <-'和'second <-'使它們全部歸零,午夜實際上保持不變。的古怪。這可能是一個「不完美」,並在R中進行日期處理。 – 2014-09-21 22:37:06

+2

@RichardScriven:我認爲這是一個缺陷。 OP的問題根本不是問題。這與爭論的一個問題類似,即數字1不會將小數點右邊的零打印出來。 – 2014-09-21 22:42:34

+1

@JoshuaUlrich但午夜是一天的實際時間,所以不應該這樣打印? – 2014-09-21 22:43:26

回答

5

這只是print,如果日期的時間部分是午夜,則刪除精度。這是在??strftime幫助中解釋的升降機,特別是格式參數:

一個字符串。如果任何 組件具有非午夜的時間分量,則缺省值爲「%Y-%m-%d%H:%M:%S」 否則

一個想法是重新定義S3方法print爲POSIXct對象:

print.POSIXct <- function(x,...)print(format(x,"%Y-%m-%d %H:%M:%S")) 

現在對於你的例子,如果你的打印你的X日期(午夜部分),您將獲得:

x <- "2007-02-01 00:00:00" 
x <- as.POSIXct(x,tz=Sys.timezone()) 
x 
[1] "2007-02-01 00:00:00" 
+4

影響打印的代碼實際上是'format.POSIXlt',其中'format.POSIXct'調用,其中'print.POSIXct'調用 - 'if(all(times [! is.na(times)] == 0)); 「%Y-%間 - %d」;' – thelatemail 2014-09-21 22:41:51