ما هي الطريقة الفعالة لتقسيم الفواصل الزمنية التجميعية من صفوف الطابع الزمني في إطار البيانات؟
سؤال
من إطار البيانات مع صفوف الطابع الزمني (نتائج الشرط)، ما هي أفضل طريقة للإحصاءات التجميعية للفواصل الزمنية؟
قد تكون الفواصل الزمنية ساعة، في اليوم، إلخ.
هناك aggregate
وظيفة، ولكن هذا لا يساعد في تعيين كل صف إلى الفاصل الزمني. أخطط لإضافة عمود إلى إطار البيانات الذي يدل على الفاصل الزمني واستخدام ذلك مع aggregate
, ، ولكن إذا كان هناك حل أفضل، فسيكون ذلك رائعا لسماع ذلك.
شكرا لأي مؤشرات!
مثال البيانات
خمس صفوف مع الطوابع الزمنية مقسمة إلى فترات 15 دقيقة تبدأ من الساعة 03:00.
الفاصل 1.
- "2010-01-13 03:02:38 UTC"
- "2010-01-13 03:08:14 UTC"
- "2010-01-13 03:14:52 UTC"
الفاصل 2.
- "2010-01-13 03:20:42 UTC"
- "2010-01-13 03:22:19 UTC"
خاتمة
باستخدام حزمة سلسلة زمنية مثل xts
يجب أن يكون الحل؛ ومع ذلك لم يكن لدي أي نجاح باستخدامها وينفت باستخدام cut
. وبعد بينما كنت في الوقت الحالي تحتاج فقط إلى ترصم الرسم البياني، مع مجموعة الصفوف المجمعة عن طريق الفاصل الزمني، كان هذا كافيا.
cut
يستخدم يحب ذلك جدا:
interv <- function(x, start, period, num.intervals) {
return(cut(x, as.POSIXlt(start)+0:num.intervals*period))
}
المحلول
الوظائف القياسية لتقسيم ناقلات cut
و findInterval
:
v <- as.POSIXct(c(
"2010-01-13 03:02:38 UTC",
"2010-01-13 03:08:14 UTC",
"2010-01-13 03:14:52 UTC",
"2010-01-13 03:20:42 UTC",
"2010-01-13 03:22:19 UTC"
))
# Your function return list:
interv(v, as.POSIXlt("2010-01-13 03:00:00 UTC"), 900)
# [[1]]
# [1] "2010-01-13 03:00:00"
# [[2]]
# [1] "2010-01-13 03:00:00"
# [[3]]
# [1] "2010-01-13 03:00:00"
# [[4]]
# [1] "2010-01-13 03:15:00 CET"
# [[5]]
# [1] "2010-01-13 03:15:00 CET"
# cut returns factor, you must provide proper breaks:
cut(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900)
# [1] 2010-01-13 03:00:00 2010-01-13 03:00:00 2010-01-13 03:00:00
# [4] 2010-01-13 03:15:00 2010-01-13 03:15:00
# Levels: 2010-01-13 03:00:00 2010-01-13 03:15:00
# findInterval returns vector of interval id (breaks like in cut)
findInterval(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900)
# [1] 1 1 1 2 2
للسجل: cut
لديه طريقة ل POSIXt
اكتب، لكن لسوء الحظ لا توجد طريقة لتوفيرها start
حجة، التأثير هو:
cut(v,"15 min")
# [1] 2010-01-13 03:02:00 2010-01-13 03:02:00 2010-01-13 03:02:00
# [4] 2010-01-13 03:17:00 2010-01-13 03:17:00
# Levels: 2010-01-13 03:02:00 2010-01-13 03:17:00
كما ترى أنها تبدأ في 03:02:00. يمكنك الفوضى مع ملصقات عامل الإخراج (تحويل التسميات إلى الوقت، جولة بطريقة أو بأخرى وتحويلها إلى الشخصية).
نصائح أخرى
إستخدم حزمة سلسلة الوقت. حزمة XTS لديها وظائف مصممة خصيصا للقيام بذلك. أو إلقاء نظرة على المهام والوظائف Rollapply في حزمة حديقة الحيوان.
يحتوي الكتاب الاليكترونى على مناقشة مفيدة، بما في ذلك مقارنة أداء الحزم المختلفة: https://www.rmetrics.org/files/freepdf/timeseriesfaq.pdf.
تعديل: ينظر الى إجابتي على هذا السؤال. وبعد في الأساس تحتاج إلى اقتطاع كل طابع زمني في فاصل زمني محدد، ثم قم بإجراء التجميع باستخدام هذه الطوابع الزمنية المقطوعة الجديدة كمتجه تجمع.
هذا سؤال جيد؛ مع انتشار حزم وطرق السلسلة الزمنية المختلفة، يجب أن يكون هناك نهج لسلسلة زمنية غير منتظمة بصرية بخلاف القوة الغاشمة التي يوحي فيها المرجع. هنا طريقة واحدة "رفيعة المستوى" للحصول على الفواصل الزمنية التي يمكنك استخدامها بعد ذلك aggregate
et al، باستخدام نسخة من cut
محددة ل chron
أشياء.
require(chron)
require(timeSeries)
my.times <- "
2010-01-13 03:02:38 UTC
2010-01-13 03:08:14 UTC
2010-01-13 03:14:52 UTC
2010-01-13 03:20:42 UTC
2010-01-13 03:22:19 UTC
"
time.df <- read.delim(textConnection(my.times),header=FALSE,sep="\n",strip.white=FALSE)
time.seq <- seq(trunc(timeDate(time.df[1,1]),units="hours"),by=15*60,length=nrow(time.df))
intervals <- as.numeric(cut(as.chron(as.character(time.df$V1)),breaks=as.chron(as.character(time.seq))))
لقد حصلت
intervals
[1] 1 1 1 2 2
التي يمكنك الآن إلحاق إطار البيانات وتجميعها.
يعد Acrobatics Versions أعلاه (من الحرف إلى Timedate إلى Transtate To Chron) مؤسف قليلا، لذلك إذا كانت هناك حلول نظافة لبيانات الوقت غير المنتظم باستخدام XTS أو أي من حزم الأماكن الأخرى، فأنا أحب أن أسمع عنها أيضا ! ..
أنا أيضا فضولية لمعرفة ما سيكون النهج الأكثر كفاءة لسلسلة زمنية غير منتظمة عالية التردد العالية، مثل إنشاء أشرطة حجم دقيقة واحدة على بيانات القراد للحصول على مخزون سائل للغاية.