Создайте серию временных меток в миллисекундах в r

У меня дата начала «2017-11-14 10:11:01 CET» и дата окончания «2017-11-15 01:15:59 CET». Я хочу создать отметки времени по 500 миллисекунд каждая между этими отметками времени начала и окончания. Например. Мне нужен фрейм данных, содержащий следующий вывод

timestamp
2017-11-14 10:11:01.000
2017-11-14 10:11:01.500
2017-11-14 10:11:02.000
2017-11-14 10:11:02.500
.
.
.
2017-11-15 01:15:59.000

Каким-то образом мне удалось получить дату начала и окончания в миллисекундах, используя следующий код:

start.date <- strptime("2017-11-14 10:11:01 CET", "%Y-%m-%d %H:%M:%OS")
start.date <- format(start.date, "%Y-%m-%d %H:%M:%OS3")
Output: "2017-11-14 10:11:01.000"

Точно так же я получил дату окончания как 2017-11-15 01:15:59.000. Теперь я хочу использовать функцию последовательности для создания последовательности временных меток по 500 миллисекунд каждая. Я сделал что-то вроде

seq.POSIXt(as.POSIXct(start), as.POSIXct(end), units = "milliseconds", by = 500)

но он создал серию по 20 секунд. например.,

"2017-11-14 10:11:01 CET" 
"2017-11-14 10:19:21 CET" 
"2017-11-14 10:27:41 CET"
.
.
.
"2017-11-15 01:11:01 CET"

Как только я смогу получить эту серию, я хочу преобразовать ее во временные метки UNIX. Может ли кто-нибудь помочь мне решить эту проблему?

1
0
1 116
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не знаю, ищете ли вы это, но похоже, что это работает

seq.POSIXt(as.POSIXct(start), as.POSIXct(end), units = "seconds", by = .5)

Он дает правильную серию, но я не могу в дальнейшем преобразовать их в метку времени UNIX. Например. Если у меня есть что-то вроде «2017-11-14 11: 34: 19.5 CET», то его преобразование UNIX округляет 0,5 секунды и дает мне «2017-11-14 11:34:20 CET». Для преобразования Unix я использую следующее: as.numeric (as.POSIXct ("2017-11-14 11: 34: 19.500"), tz = "GMT", origin = "1970-01-01")

Nilakshi Naphade 10.08.2018 16:53

Сейчас я просто использую даты POSIXct. В любом случае спасибо :)

Nilakshi Naphade 10.08.2018 17:36
seq.POSIXt() не имеет аргумента с именем units, поэтому units = "seconds" будет проигнорирован и не имеет смысла.
Darren Tsai 02.04.2020 17:37

Когда вы используете функцию as.integer, она избавляется от десятичной части числа, в вашем случае от миллисекунд.

Я предлагаю вам использовать этот обходной путь, чтобы получить желаемое число в формате UNIX. Чтобы получить желаемый результат, вы можете взять результат функции как.integer, а затем прикрепить в конце то, что вам нужно. Поскольку ваши временные метки UNIX будут иметь только последние три цифры, равные 000 или 500, вы можете попробовать:

k<-as.numeric(seq.POSIXt(as.POSIXct(start.date), as.POSIXct(stop.date), units = "seconds", by = .5))[1:4]


k1<-cbind(substr(as.character(k), 1, 10),c("000","500"))

as.numeric(paste0(k1[,1],k1[,2]))
[1] 1510650661000 1510650661500 1510650662000 1510650662500

Обратите внимание, что я делаю это только с первыми 4 элементами вектора, но логика остается той же.

Другие вопросы по теме