Ubah waktu tanggal menjadi string waktu yang diformat

Saya tidak tahu mengapa itu tidak berhasil. Ini kode saya:

> 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"

Pembaruan:

Saat ini saya menemukan solusi ini, tapi saya harap ada solusi yang lebih elegan:

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 sumber


Jawaban (3)


Tidak yakin mengapa Anda perlu mengonversi ke hms dan kembali ke format string awal. Mungkin fungsi parse_date_time adalah yang Anda butuhkan:

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"

EDIT: Kita dapat menggunakan 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"

Keluaran tolok ukur:

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
Sepertinya ini ide yang lebih baik. - person MrFlick; 04.09.2014
comment
Saya menganggap (secara paranois) format string menyimpan beberapa byte untuk setiap entri saat menulis ke file teks. Namun solusi Anda tidak sesuai dengan apa yang ingin saya capai. Baris ini adalah chicken-egg masalah: POSIXct_myTime <- parse_date_time(myTime,"hms"). Saya tidak memiliki myTime dalam format string. Saya membaca jutaan entri dalam format %H:%M:%S, memfilternya dan ingin menulis kembali format yang sama persis dengan inputnya. - person biocyberman; 05.09.2014
comment
...format string menyimpan beberapa byte untuk setiap entri saat menulis ke file teks... - tidak yakin ini benar... Juga, ...Saya tidak memiliki myTime dalam format string... - di posting Anda meneruskan string ke hms - hms("14:11:49") - person zx8754; 05.09.2014
comment
Maaf bila membingungkan. Saya hanya meletakkan baris hms("14:11:49") hanya untuk membuat objek dari string waktu. Alur kerja saya seperti ini: membaca jutaan entri string waktu; gunakan pelumas untuk melakukan beberapa perhitungan; tulis kembali ke file teks hasilnya. Silakan periksa awal pertanyaan saya yang diperbarui - person biocyberman; 05.09.2014
comment
@biocyberman lihat pembaruan dengan solusi tempel dan keluaran benchmark. - person zx8754; 05.09.2014
comment
Saya lupa tentang fungsi paste dalam kasus ini. Namun saya berharap ada cara untuk menghindari panggilan hour, minute dan second. Pikiran saya: Paket lubridate jelas sangat bagus dalam membaca banyak format tanggal dan waktu masukan, tetapi tidak pandai mengembalikan keluaran tersebut. - person biocyberman; 05.09.2014
comment
Sayangnya, solusi paste mencetak 04 sebagai 4. Saya menambahkan solusi sederhana menggunakan fungsi format. - person shosaco; 27.02.2019

Masalahnya adalah class(t) adalah "Periode" dan fungsi format.Period() tidak memiliki parameter untuk format=. Objek t bukan objek gaya POSIXt standar yang mungkin biasa Anda gunakan dengan format(). Hanya fungsi format.POSIXct() dan format.POSIXlt() yang akan berperilaku seperti itu.

Jadi mungkin hal termudah untuk dilakukan adalah mendefinisikan fungsi pembantu untuk mengubah kelas Period menjadi POSIXct. Kita dapat melakukannya dengan:

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

Penting untuk diperhatikan bahwa POSIXct adalah nilai tanggal/waktu, bukan hanya nilai waktu. Jadi secara default kita asumsikan saja ini dimulai pada tengah malam hari ini. Tapi kemudian kita bisa menggunakan format sesuai keinginan Anda

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

Harus saya akui bahwa saya bukan pengguna ahli lubridate jadi mungkin saya telah mengabaikan fungsi yang sudah jelas, tetapi tampaknya opsi untuk memformat kelas lubridate ke dalam format "cantik" sangat terbatas.

person MrFlick    schedule 04.09.2014
comment
Solusi ini berfungsi, tetapi memerlukan langkah ekstra untuk mengonversi objek waktu menjadi objek date_time. Bagaimanapun, terima kasih telah menyebutkan fungsi format.POSIXct() dan format.POSIXlt(). - person biocyberman; 05.09.2014
comment
Ya, pertanyaan awal Anda hanyalah Anda tidak tahu mengapa itu tidak berhasil, itu tidak meminta solusi untuk apa pun. Jika itu bukan pertanyaan Anda yang sebenarnya, saya akan mencoba menjawab pertanyaan Anda dengan lebih baik di masa mendatang. Saya hanya melakukan konversi karena Anda sepertinya sangat ingin menggunakan fungsi format dengan sintaks "%H:%M:%S". - person MrFlick; 05.09.2014

Solusi yang diusulkan tidak mencetak angka nol di depan. Solusi berikut tampaknya lebih elegan:

> 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