ما هي الطريقة الفعالة لتقسيم الفواصل الزمنية التجميعية من صفوف الطابع الزمني في إطار البيانات؟

StackOverflow https://stackoverflow.com/questions/2441136

  •  19-09-2019
  •  | 
  •  

سؤال

من إطار البيانات مع صفوف الطابع الزمني (نتائج الشرط)، ما هي أفضل طريقة للإحصاءات التجميعية للفواصل الزمنية؟

قد تكون الفواصل الزمنية ساعة، في اليوم، إلخ.

هناك 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 أو أي من حزم الأماكن الأخرى، فأنا أحب أن أسمع عنها أيضا ! ..

أنا أيضا فضولية لمعرفة ما سيكون النهج الأكثر كفاءة لسلسلة زمنية غير منتظمة عالية التردد العالية، مثل إنشاء أشرطة حجم دقيقة واحدة على بيانات القراد للحصول على مخزون سائل للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top