2016-08-02 127 views
1

我有一些從Python導出的timedelta字符串。我試圖導入它們在R中使用,但我得到了一些奇怪的結果。R difftime減去2天

當timedeltas小,我得到的結果2天關閉,如:

> as.difftime('26 days 04:53:36.000000000',format='%d days %H:%M:%S.000000000') 

Time difference of 24.20389 days 

當它們更大,它不工作的時候:

> as.difftime('36 days 04:53:36.000000000',format='%d days %H:%M:%S.000000000') 
Time difference of NA secs 
+0

請參閱http://stackoverflow.com/questions/12649641/calculating-time-difference-in-r。簡而言之,就像你在這裏嘗試的那樣,你不能用字符串來做日期/時間數學。 – tluh

+0

從'?strptime','%d'是「*月的日期,十進制數(01-31)。*」,而不是天數。我沒有解決方案,但是這可以解釋這種行爲(超過31天會導致'NA') – Gregor

+0

@tluh這不是數學,只是強迫使用「difftime」對象。 – Gregor

回答

1

我也讀了'R'一些時間增量對象,我用'Python'處理過,並且與26 days 04:53:36.000000000格式有類似的問題。正如Gregor所說,strptime中的%d是當月的一天,作爲零填充的十進制數,所以不適用於> 31的數字,並且似乎沒有累積日期的選項(可能是因爲strptime是日期時間對象而不是時間增量對象)。

我的解決方案是將對象轉換爲字符串,並按照Gregor的建議提取數字數據,並使用gsub函數完成此操作。

# convert to strings 
data$tdelta <- as.character(data$tdelta) 
# extract numerical data 
days <- as.numeric(gsub('^.*([0-9]+) days.*$','\\1',data$tdelta)) 
hours <- as.numeric(gsub('^.*ys ([0-9]+):.*$','\\1',data$tdelta)) 
minutes <- as.numeric(gsub('^.*:([0-9]+):.*$','\\1',data$tdelta)) 
seconds <- as.numeric(gsub('^.*:([0-9]+)..*$','\\1',data$tdelta)) 
# add up numerical components to whatever units you want 
time_diff_seconds <- seconds + minutes*60 + hours*60*60 + days*24*60*60 
# add column to data frame 
data$tdelta <- time_diff_seconds 

這應該允許你用時差做計算。希望有所幫助。

+0

非常感謝 - 我做了非常相似的事情 – Jeremy