簡體   English   中英

比較R中的兩個日期

[英]Compare two dates in R

我有一個以制表符分隔的文本文件,我導入到R.我使用以下命令進行導入:

data = read.table(soubor, header = TRUE, sep = "\t", dec = ".", colClasses =c("numeric","numeric","character","Date","numeric","numeric"))

當我運行str(data)來檢查我的列的數據類型時,我得到:

'data.frame':   211931 obs. of  6 variables:
$ DataValue   : num  0 0 0 0 0 0 0 0 0 NA ...
$ SiteID      : num  1 1 1 1 1 1 1 1 1 1 ...
$ VariableCode: chr  "Sucho" "Sucho" "Sucho" "Sucho" ...
$ DateTimeUTC : Date, format: "2012-07-01" "2012-07-02" "2012-07-03" "2012-07-04" ...
$ Latitude    : num  50.8 50.8 50.8 50.8 50.8 ...
$ Longitude   : num  15.6 15.6 15.6 15.6 15.6 ...

我的前20行數據的可重現樣本如下:

my_sample = dput(data [1:20,])

structure(list(DataValue = c(0, 0, 0, 0, 0, 0, 0, 0, 0, NA, NA, 
NA, NA, NA, NA, NA, NA, 0, 0, 0), SiteID = c(1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), VariableCode = c("Sucho", 
"Sucho", "Sucho", "Sucho", "Sucho", "Sucho", "Sucho", "Sucho", 
"Sucho", "Sucho", "Sucho", "Sucho", "Sucho", "Sucho", "Sucho", 
"Sucho", "Sucho", "Sucho", "Sucho", "Sucho"), DateTimeUTC = structure(c(15522, 
15523, 15524, 15525, 15526, 15527, 15528, 15529, 15530, 15531, 
15532, 15533, 15534, 15535, 15536, 15537, 15538, 15539, 15540, 
15541), class = "Date"), Latitude = c(50.77, 50.77, 50.77, 50.77, 
50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 
50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 50.77), Longitude = c(15.55, 
15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 
15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 
15.55)), .Names = c("DataValue", "SiteID", "VariableCode", "DateTimeUTC", 
"Latitude", "Longitude"), row.names = c(NA, 20L), class = "data.frame")

現在我想按日期過濾我的表格。 請注意,我在for循環中運行我的代碼。 首先,我在2012年7月1日之前對數據進行子集化並進行一些處理。 然后,我在7月2日之前對我的數據進行子集化並進行一些處理,依此類推。例如,我希望獲得日期等於2012年7月6日的所有行。我嘗試了代碼:

startDate = as.Date("2012-07-01");
endDate = as.Date("2012-07-20");
all_dates = seq(startDate, endDate, 1);

#the following code I'm trying to run inside a loop...
for (j in 1:length(all_dates)) {
    filterdate = all_dates[j];
    my_subset = my_sample[my_sample$DateTimeUTC == filterdate,]
    #now I want do do some processing on my_subset...
}

但是上面的代碼從循環的第7步開始返回一個空數據集。

所以,例如:

subset_one = my_sample[my_sample$DateTimeUTC == all_dates[6],]

返回: 3 obs of 6 variables

但是,由於一些未知的原因,例子:

subset_two = my_sample[my_sample$DateTimeUTC == all_dates[7],]

返回: 0 obs of 6 variables

(注意:我編輯了上面的代碼,使我的問題100%可重復)

我有什么想法我做錯了嗎?

以下解決方案解決了我的問題:我嘗試使用POSIXct數據類型,而不是使用Date數據類型。 下面是用於讀取制表符分隔文本文件的示例代碼,之后子集化在for循環的所有步驟中都起作用:

data = read.table("data.txt", header = TRUE, sep = "\t", dec = ".", 
    colClasses =c("numeric","numeric","character","POSIXct","numeric","numeric"));
startDate = as.POSIXct("2012-07-01");
endDate = as.POSIXct("2012-07-20");
all_dates = seq(startDate, endDate, 86400); #86400 is num of seconds in a day

#the following code I'm trying to run inside a loop...
for (j in 1:length(all_dates)) {
    filterdate = all_dates[j];
    my_subset = data[data$DateTimeUTC == filterdate,]
    #now I want do do some processing on my_subset...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM