سؤال

بعد تحويل العوامل بتنسيق POSIXCT ثم تطبيق تنسيق التاريخ والوقت، أريد أن أحسب الفرق بين التاريخ والوقت بين 2 pos1 وpos2.

ومع ذلك، عندما أفعل ذلك لعنصر معين، أحصل على الإجابة الصحيحة في وحدة التحكم ولكن عندما أقوم بالعملية على المجموعة بأكملها، فإن وحدة التحكم تخرج رقمًا فقط ويعكس إطار التاريخ أيضًا هذا الرقم كما ترون.

كيف يمكنني الحصول على الساعات في إطار البيانات عندما أحاول أخذ الفرق؟أنا أستخدم حزمة lubridate، هل هناك أي وظيفة للقيام بذلك؟

فيما يلي بعض الأمثلة على الكود/الصورة للبيانات الموجودة في RStudio التي تصفها

CR_Date <- data.frame(
  pos1="2014-07-01 00:00:00",
  pos2=c("2014-07-01 00:00:00","2014-07-01 10:15:00")
)
CR_Date[] <- lapply(CR_Date,as.POSIXct)
CR_Date

#        pos1                pos2
#1 2014-07-01 2014-07-01 00:00:00
#2 2014-07-01 2014-07-01 10:15:00

CR_Date$pos2[2] - CR_Date$pos1[2]
#Time difference of 10.25 hours
CR_Date$hours <- CR_Date$pos2 - CR_Date$pos1

enter image description here

هل كانت مفيدة؟

المحلول

أولا، هذا ليس له علاقة بالتشحيم.

ثانيًا، لقد خذلك RStudio عن طريق العبث بطباعة المتغير في نافذة العرض.إذا دخلت CR_Date$hours في نافذة سطر الأوامر سترى أنه يطبع

#Time differences in secs
#[1]     0 36900

و head(CR_Date) يعطي:

#        pos1                pos2      hours
#1 2014-07-01 2014-07-01 00:00:00     0 secs
#2 2014-07-01 2014-07-01 10:15:00 36900 secs

أي منهما كان سيخبرك بما يتم عرضه.

كما يقترح @Victorp، difftime هو الطريق لحل هذا:

CR_Date$hours <- with(CR_Date, difftime(pos2,pos1,units="hours") )
CR_Date

#        pos1                pos2       hours
#1 2014-07-01 2014-07-01 00:00:00  0.00 hours
#2 2014-07-01 2014-07-01 10:15:00 10.25 hours

نصائح أخرى

يمكنك أيضًا استخدام "as.double الطريقة" و units حجة (انظر ?diffime):

as.double طريقة [as.double(x, units = "auto", ...)] تُرجع القيمة الرقمية المعبر عنها بالوحدات المحددة

...أين x يكون

كائن يرث من الطبقة "difftime"

تنطبق على المثال الخاص بك، حيث pos2 - pos1 سيؤدي إلى أ difftime هدف:

CR_Date$hours <- as.double(CR_Date$pos2 - CR_Date$pos1, units = "hours")
CR_Date

#        pos1                pos2 hours
#1 2014-07-01 2014-07-01 00:00:00  0.00
#2 2014-07-01 2014-07-01 10:15:00 10.25

أو غيرها units:

as.double(CR_Date$pos2 - CR_Date$pos1, units = "mins")
#[1]   0 615

as.double(CR_Date$pos2 - CR_Date$pos1, units = "days")
#[1] 0.0000000 0.4270833
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top