Tôi có hai ngàyngày Đếm mỗi năm
begin <- as.Date("2007-05-20")
end <- as.Date("2010-06-13")
Làm thế nào tôi có thể đếm số ngày mỗi năm?
Sản lượng nên có thể trông giống như
year days
2007 226
2008 366
2009 365
2010 164
Tôi có hai ngàyngày Đếm mỗi năm
begin <- as.Date("2007-05-20")
end <- as.Date("2010-06-13")
Làm thế nào tôi có thể đếm số ngày mỗi năm?
Sản lượng nên có thể trông giống như
year days
2007 226
2008 366
2009 365
2010 164
Hãy đầu tiên tạo ra một chuỗi ngày thích hợp:
R> bd <- as.Date("2007-05-20")
R> ed <- as.Date("2010-06-13")
R> seqd <- seq(bd, ed, by="1 day")
R> head(seqd)
[1] "2007-05-20" "2007-05-21" "2007-05-22" "2007-05-23" "2007-05-24" "2007-05-25"
Sau đó chúng tôi tạo một hàm helper đó, được đưa ra một ngày, trở về năm của nó:
R> getYear <- function(d) as.POSIXlt(d)$year + 1900
R> getYear(head(seqd))
[1] 2007 2007 2007 2007 2007 2007
Sau đó, chúng ta chỉ cần gọi table()
trên những gì người trợ giúp trả về từ chuỗi ngày:
R> table(getYear(seqd))
2007 2008 2009 2010
226 366 365 164
Something này như thế này nên làm như lừa:
function daysPerYear(begin, end)
{
var days = {};
for (var y = begin.getFullYear(); y < end.getFullYear(); y++)
{
days[y] = Math.ceil((new Date(y+1, 0, 1) - begin)/86400000);
begin = new Date(y+1, 0, 1);
}
days[ end.getFullYear() ] = Math.ceil((end - begin)/86400000);
return days;
}
mẫu:
console.log(daysPerYear(new Date("2007-05-20"), new Date("2010-06-13")));
Chỉnh sửa: Tôi nghĩ đây là về Javascript.
yea Tôi đã tự hỏi :) nhưng tốt mã hóa anyway! – speendo
Hoặc, cách khác tạo một data.frame
với một cột bổ sung year
(sử dụng dữ liệu Dirk của):
dat = data.frame(seqd, year = strftime(seqd, "%Y"))
> head(dat)
seqd year
1 2007-05-20 2007
2 2007-05-21 2007
3 2007-05-22 2007
4 2007-05-23 2007
5 2007-05-24 2007
6 2007-05-25 2007
và sau đó sử dụng count
từ gói plyr:
require(plyr)
> count(dat, "year")
year freq
1 2007 226
2 2008 366
3 2009 365
4 2010 164
Một giải pháp chuyên sâu ít bộ nhớ sẽ là, mặc dù không phải là một lót:)
begin <- as.POSIXlt("2007-05-20", tz = "GMT")
end <- as.POSIXlt("2010-06-13", tz = "GMT")
year <- seq(begin$year, end$year) + 1900
year.begin <- as.POSIXlt(paste(year, "01", "01", sep="-"), tz="GMT")
year.begin[1] <- begin
year.end <- as.POSIXlt(paste(year, "12", "31", sep="-"), tz="GMT")
year.end[length(year.end)] <- end
days <- as.numeric(year.end - year.begin) + 1
cbind(year, days)
Thúc đẩy bởi Make this process more processor intensive and less memory intensive
Một biến thể nhỏ ở trên sẽ là: 'bảng (định dạng (seq (bd, ed," ngày "),"% Y "))' –
Đẹp một Gabor. Tôi không thể nhớ là bộ chiết xuất ngắn gọn nhất; phiên bản của bạn chắc chắn đủ điều kiện. –