แปลงวันที่และเวลาเป็นสตริงเวลาที่จัดรูปแบบ

ฉันไม่รู้ว่าทำไมมันไม่ทำงาน นี่คือรหัสของฉัน:

> t <- hms("14:11:49")
> t
[1] "14H 11M 49S"
t <- t + minutes(3)
> format(t, format="%H:%M:%S")
[1] "14H 14M 49S"
# Expected output: "14:14:49"

อัปเดต:

ขณะนี้ฉันพบวิธีแก้ปัญหานี้แล้ว แต่ฉันหวังว่าจะมีวิธีที่หรูหรากว่านี้:

t <- hms("14:11:49") # example period object
sprintf("%s:%s:%s", hour(t), minute(t), second(t))
#"14:11:49"

person biocyberman    schedule 04.09.2014    source แหล่งที่มา


คำตอบ (3)


ไม่แน่ใจว่าทำไมคุณต้องแปลงเป็น hms และกลับเป็นรูปแบบสตริงเริ่มต้น บางทีฟังก์ชัน parse_date_time อาจเป็นสิ่งที่คุณต้องการ:

library(lubridate)
myTime <- "14:11:49"
hms(myTime)
#"14H 11M 49S"

POSIXct_myTime <- parse_date_time(myTime,"hms")
format(POSIXct_myTime, format="%H:%M:%S")
#"14:11:49"

แก้ไข: เราสามารถใช้ paste:

t <- hms("14:11:49")
t
#[1] "14H 11M 49S"
t <- t + minutes(3)
t
#[1] "14H 14M 49S"

paste(hour(t),minute(t),second(t),sep=":")
#[1] "14:14:49"

เอาต์พุตมาตรฐาน:

op <- microbenchmark(
  Use_paste=paste(hour(t),minute(t),second(t),sep=":"),
  Use_sprintf=sprintf("%s:%s:%s", hour(t), minute(t), second(t)),
  times=1000000L)
op

# Unit: microseconds
# expr    min     lq median     uq      max neval
# Use_paste 28.072 31.695 32.601 33.506 44253.42 1e+06
# Use_sprintf 29.582 33.807 34.412 35.619 44367.52 1e+0
person zx8754    schedule 04.09.2014
comment
นี่ดูเหมือนจะเป็นความคิดที่ดีกว่า - person MrFlick; 04.09.2014
comment
ฉันพิจารณา (หวาดระแวง) รูปแบบสตริงบันทึกบางไบต์สำหรับแต่ละรายการเมื่อเขียนลงในไฟล์ข้อความ โซลูชันของคุณไม่ได้ทำสิ่งที่ฉันพยายามทำให้สำเร็จ บรรทัดนี้คือ chicken-egg ปัญหา: POSIXct_myTime <- parse_date_time(myTime,"hms") ฉันไม่มี myTime ในรูปแบบสตริง ฉันอ่านรายการหลายล้านรายการในรูปแบบ %H:%M:%S กรองรายการเหล่านั้น และต้องการเขียนกลับออกมาในรูปแบบเดียวกันกับอินพุตทุกประการ - person biocyberman; 05.09.2014
comment
...รูปแบบสตริงจะบันทึกบางไบต์สำหรับแต่ละรายการเมื่อเขียนลงในไฟล์ข้อความ... - ไม่แน่ใจว่าสิ่งนี้เป็นจริง... นอกจากนี้ ...ฉันไม่มี myTime ในรูปแบบสตริง... - ในของคุณ โพสต์ว่าคุณกำลังส่งสตริงไปที่ hms - hms("14:11:49") - person zx8754; 05.09.2014
comment
ขอโทษสำหรับความสับสน. ฉันใส่เพียงบรรทัด hms("14:11:49") เพื่อสร้างวัตถุจากสตริงเวลา ขั้นตอนการทำงานของฉันเป็นเช่นนี้: อ่านสตริงเวลาหลายล้านรายการ ใช้ lubridate เพื่อคำนวณ เขียนกลับออกไปในไฟล์ข้อความผลลัพธ์ โปรดตรวจสอบจุดเริ่มต้นของคำถามที่อัปเดตของฉัน - person biocyberman; 05.09.2014
comment
@biocyberman ดูการอัปเดตด้วยโซลูชันการวางและเอาต์พุตการวัดประสิทธิภาพ - person zx8754; 05.09.2014
comment
ฉันลืมเกี่ยวกับฟังก์ชัน paste ในกรณีนี้ แต่ฉันหวังว่าจะมีวิธีหลีกเลี่ยงการโทร hour, minute และ second ความคิดของฉัน: เห็นได้ชัดว่าแพ็คเกจ lubridate นั้นดีมากในการอ่านในรูปแบบวันที่และเวลาอินพุตหลายรูปแบบ แต่ไม่ค่อยดีนักในการให้เอาต์พุตเหล่านั้นกลับออกมา - person biocyberman; 05.09.2014
comment
น่าเสียดายที่โซลูชัน paste พิมพ์ 04 เป็น 4 ฉันเพิ่มวิธีแก้ปัญหาง่ายๆ โดยใช้ฟังก์ชัน format - person shosaco; 27.02.2019

ปัญหาคือ class(t) คือ "Period" และฟังก์ชัน format.Period() ไม่มีพารามิเตอร์สำหรับ format= ออบเจ็กต์ t ไม่ใช่ออบเจ็กต์สไตล์ POSIXt มาตรฐานที่คุณอาจคุ้นเคยกับการใช้กับ format() เฉพาะฟังก์ชัน format.POSIXct() และ format.POSIXlt() เท่านั้นที่จะทำงานเช่นนั้น

ดังนั้นบางทีสิ่งที่ง่ายที่สุดที่จะทำคือการกำหนดฟังก์ชันตัวช่วยเพื่อเปลี่ยนคลาส Period ให้เป็น POSIXct เราสามารถทำได้ด้วย:

as.POSIXct.Period <- function(x, start=today()) {
    X<-as.interval(x, start); 
    [email protected]+X@start
}

สิ่งสำคัญคือต้องทราบว่า POSIXct เป็นค่าวันที่/เวลา ไม่ใช่เพียงค่าเวลา โดยค่าเริ่มต้น เราถือว่าวันนี้เริ่มตอนเที่ยงคืน แต่เราสามารถใช้รูปแบบตามที่คุณต้องการได้

format(as.POSIXct(t), format="%H:%M:%S")
# [1] "14:11:49"

ฉันต้องยอมรับว่าฉันไม่ใช่ผู้ใช้ lubridate ที่เชี่ยวชาญ ดังนั้นบางทีฉันอาจมองข้ามฟังก์ชันที่ชัดเจนไป แต่ดูเหมือนว่าตัวเลือกสำหรับการจัดรูปแบบคลาส lubridate เป็นรูปแบบที่ "สวย" นั้นมีจำกัดมาก

person MrFlick    schedule 04.09.2014
comment
โซลูชันนี้ใช้งานได้ แต่ต้องมีขั้นตอนเพิ่มเติมในการแปลงเวลาเป็นวัตถุ date_time ยังไงก็ตาม ขอขอบคุณที่พูดถึงฟังก์ชัน format.POSIXct() และ format.POSIXlt() - person biocyberman; 05.09.2014
comment
คำถามเดิมของคุณคือคุณไม่รู้ว่าทำไมมันถึงใช้งานไม่ได้ มันไม่ได้ถามถึงวิธีแก้ปัญหาใดๆ หากนั่นไม่ใช่คำถามของคุณจริงๆ ฉันจะพยายามตอบคำถามของคุณให้ดีขึ้นในอนาคต ฉันเพียงทำการแปลงเพราะดูเหมือนว่าคุณต้องการใช้ฟังก์ชัน format กับไวยากรณ์ "%H:%M:%S" จริงๆ - person MrFlick; 05.09.2014

โซลูชันที่นำเสนอไม่พิมพ์เลขศูนย์นำหน้า วิธีแก้ปัญหาต่อไปนี้ดูหรูหรากว่า:

> t <- hms("14:01:49") + minutes(3)
> sprintf("%s:%s:%s", hour(t), minute(t), second(t))
[1] "14:4:49" # looking weird
> format(Sys.Date() + t, "%H:%M:%S")
[1] "14:04:49" # looking better
person shosaco    schedule 27.02.2019