كيف يمكنني مطابقة إطارات البيانات بفواصل زمنية؟

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

  •  30-09-2019
  •  | 
  •  

سؤال

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

تبدو بيانات مسجل درجة الحرارة مثل:

           datetime temperature
2010-09-30 06:58:53 78.996
2010-09-30 07:08:53 78.645
2010-09-30 07:18:53 78.514
2010-09-30 07:28:53 79.173
2010-09-30 07:38:53 78.602

تبدو بيانات مسجل الغاز مثل:

           datetime gas
2010-09-30 13:45:00  0
2010-09-30 13:55:00  1
2010-09-30 14:05:00  0
2010-09-30 14:15:00  4
2010-09-30 14:25:00  2

أرغب في الجمع بين إطار البيانات على فترات زمنية مدتها عشر دقائق ، بحيث تبدو البيانات المشتركة:

           datetime temperature gas  
2010-09-30 13:40:00 NA          0
2010-09-30 13:50:00 78.996      1
2010-09-30 14:00:00 78.645      0
2010-09-30 14:10:00 78.514      4
2010-09-30 14:20:00 79.173      2
2010-09-30 07:38:53 78.602      NA

إليك بعض التعليمات البرمجية للحصول على هذين إطارين البيانات:

temps <- data.frame(datetime=c("2010-09-30 06:58:53",
"2010-09-30 07:08:53","2010-09-30 07:18:53",
"2010-09-30 07:28:53","2010-09-30 07:38:53"),
 temperature=c(78.996,78.645,78.514,79.173,78.602),
stringsAsFactors=FALSE)
temps$datetime <- strptime(temps$datetime, format="%Y-%m-%d %H:%M:%S")
gas <- data.frame(datetime=c("2010-09-30 13:45:00",
"2010-09-30 13:55:00","2010-09-30 14:05:00",
"2010-09-30 14:15:00","2010-09-30 14:25:00"),
gas=c(0,1,0,4,2),stringsAsFactors=FALSE)
gas$datetime <- strptime(temps$datetime, format="%Y-%m-%d %H:%M:%S")
هل كانت مفيدة؟

المحلول

يستخدم align.time في XTS.

library(xts)
xTemps <- align.time(xts(temps[,2],as.POSIXct(temps[,1])), n=600)
xGas <- align.time(xts(gas[,2],as.POSIXct(gas[,1])), n=600)
merge(xTemps,xGas)

نصائح أخرى

استخدم أي من حديقة حيوان أو XTS لعقد بياناتك - merge() الوظيفة ستفعل هذا من أجلك. يمكنك البحث عن الإجابات السابقة هنا. ال حديقة حيوان الوثائق لديها أيضا الكثير من الأمثلة ذات الصلة.

فيما يلي مثال نموذجية:

> set.seed(42)
> temps <- zoo(78+rnorm(5), 
+              order.by=ISOdatetime(2010,9,30,6,58,53)+cumsum(60*runif(5)))
> gas <- zoo(sample(1:5,5), 
+            order.by=ISOdatetime(2010,9,30,6,58,53)+cumsum(60*runif(5)))
> merge(temps,gas)
                     temps gas
2010-09-30 06:59:47 78.048  NA
2010-09-30 06:59:49     NA   5
2010-09-30 07:00:44 76.895  NA
2010-09-30 07:00:48     NA   1
2010-09-30 07:00:55     NA   3
2010-09-30 07:01:01 78.539  NA
2010-09-30 07:01:23     NA   2
2010-09-30 07:01:51 78.580  NA
2010-09-30 07:01:57     NA   4
2010-09-30 07:02:29 77.342  NA
> na.locf(merge(temps,gas))
                     temps gas
2010-09-30 06:59:49 78.048   5
2010-09-30 07:00:44 76.895   5
2010-09-30 07:00:48 76.895   1
2010-09-30 07:00:55 76.895   3
2010-09-30 07:01:01 78.539   3
2010-09-30 07:01:23 78.539   2
2010-09-30 07:01:51 78.580   2
2010-09-30 07:01:57 78.580   4
2010-09-30 07:02:29 77.342   4
> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top