2017-03-01 46 views
1

我可能正在與世界上最瘋狂的數據庫之一工作,我需要爲報表格式導出時間列。問題是,此列中的時間是從多個源導入的,其中一些具有適當的sql日期格式(2017-03-01 01:45:00.000),另一些日期設置爲服務器默認值,只有正確記錄的時間(1900-01-01 00:45:00.000)。帶有替換的時間列清理。

例如:

DF $日期= C( 「2017年2月1日00:00:00.000」, 「2017年3月1日00:00:00.000」,「2017年1月1日00 :00:00.000「) df $ Time = c(」1900-01-01 03:30:00.000「,」2017-03-01 04:45:00.000「,」1900-01-01 05:50:00.000 「)

我需要的結果是: properdatetime < - c(」2017-02-01 03:30:00.000「,」2017-03-01 04:45:00.000「,」2017-01-01 05:50:00.000「)

我試過了chron & gsub的混合物,但沒有骰子: 庫(代下) TMP < - C(DF $日期) TMP < -gsub( '$ {1}。', '',TMP2)

TMP2 < - C(DF $時間) TMP2 < -gsub( '^ {1} $。', '',TMP2)#regex - 保持柱的最後部分

DF $ properdatetime <。 - 克羅恩氏(日期= TMP,次= TMP2,格式= C( 'ym-d','h:m:s'))

我一直得到這個錯誤: 'Convert.dates(dates。,format = format [[1]],origin中的錯誤。 =原點): 格式年月日可能不正確」

回答

0

我基本上使用的regmatches + gregexpr組合來提取DateTime的日期和時間,然後連接起來他們創造propDateTime

Date = c("2017-02-01 00:00:00.000", "2017-03-01 00:00:00.000", "2017-01-01 00:00:00.000") 
Time = c("1900-01-01 03:30:00.000", "2017-03-01 04:45:00.000", "1900-01-01 05:50:00.000") 

Dates = regmatches(Date, gregexpr("^[[:digit:][:punct:]]+\\>", Date)) 
Times = regmatches(Time, gregexpr("\\<[[:digit:][:punct:]]+$", Time)) 

propDateTime = paste(Dates, Times) 
propDateTime = as.POSIXct(propDateTime, format = "%Y-%m-%d %H:%M:%S") 

# "2017-02-01 03:30:00 EST" "2017-03-01 04:45:00 EST" "2017-01-01 05:50:00 EST" 

這裏我用一個as.POSIXct將數據存儲爲「DateTime」對象,該對象保留了小時,分鐘和秒。請注意,創建的日期時間位於EST時區。如果它有所不同,您可以使用zone =參數指定差異時區。

+0

感謝您的幫助 - 當我運行以下操作時,我收到了錯誤「Encoding <-'('* tmp *',value =」bytes「)中的錯誤: 預期的字符向量參數」 - 是正則表達式的問題? – rattacat

+0

@rattacat不應該有錯誤。嘗試清理您的工作空間並重新運行代碼。 – useR

+0

清除兩次。當我一行一行地運行它時,它在「日期」列中工作正常,但它在「時間」列中出現,產生了該錯誤。 – rattacat