#python #csv #printing #milliseconds
#python #csv #печать #миллисекунды
Вопрос:
Я хочу печатать случайные данные в диапазоне от -1 до 1 в файле csv для каждой миллисекунды, используя Python. Я начал с печати для каждой секунды, и это сработало. Но я сталкиваюсь с трудностями при печати случайных данных за каждую миллисекунду. Я хочу, чтобы временная метка была в формате эпохи UNIX, например «1476449030.55676» (для миллисекунд десятичная точка не требуется)
tstep = datetime.timedelta(milliseconds=1)
tnext = datetime.datetime.now() tstep
NumberOfReadings = 10; # 10 values ( 1 value for 1 millisecond)
i = 0;
f = open(sys.argv[1], 'w ')
try:
writer = csv.writer(f)
while i < NumberOfReadings:
writer.writerow((random.uniform(-1, 1), time.time()))
tdiff = tnext - datetime.datetime.now()
time.sleep(float(tdiff.total_seconds()/1000))
tnext = tnext tstep
i =i 1;
finally:
f.close()
Ответ №1:
UPD: time.sleep()
принимает аргумент в секундах, поэтому вам не нужно делить его на 1000. После исправления этого мой вывод выглядит следующим образом:
0.18153176446804853,1476466290.720721
-0.9331178681567136,1476466290.721784
-0.37142653326337327,1476466290.722779
0.1397040393287503,1476466290.723766
0.7126280853504974,1476466290.724768
-0.5367844384018245,1476466290.725762
0.44284645253432786,1476466290.726747
-0.2914685960956531,1476466290.727744
-0.40353712249981943,1476466290.728778
0.035369003158632895,1476466290.729771
Что настолько хорошо, насколько это возможно, учитывая точность time.sleep и других функций времени.
Вот урезанная версия, которая выводит временные метки в стандартный вывод каждую секунду:
import time
tstep = 0.001
tnext = time.time() tstep
NumberOfReadings = 10; # 10 values ( 1 value for 1 millisecond)
for i in range(NumberOfReadings):
now = time.time()
print(now)
time.sleep(tnext - now)
tnext = tstep
================================================
В этом проблема:
float(tdiff.total_seconds()/1000)
Вы используете целочисленное деление, а затем преобразуете результат в число с плавающей запятой.
Вместо этого вам нужно использовать деление с плавающей запятой:
tdiff.total_seconds()/1000.0
Комментарии:
1. @ t_tila: Спасибо за ваш ответ. Я тоже это пробовал. Но я получаю результаты, как показано ниже: «-0.2985529200795216,1476453775.235422 0.3277184346531816,1476453775.235497 -0.651029174634272,1476453775.235593». Здесь вы можете видеть, что он печатает 3 (и более) значения за одну и ту же миллисекунду («1476453775.235 …»), а не 1 значение за 1 миллисекунду. Существует еще одна проблема с кодом..
2. Я запустил ваш фрагмент и получил одно значение 2 в строке, случайное число с плавающей запятой и временную метку. Единственные изменения, которые я внес: исправлено деление с плавающей запятой и открыт файл в
'w'
режиме.3. Я согласен. Я получаю то же самое, но это не отвечает на мой вопрос. Пожалуйста, проверьте значения каждой временной метки. Каждая строка должна иметь временную метку, которая должна содержать последовательные миллисекунды… Например, я ожидаю что-то вроде 1476453775.235 … 1476453775.236 …, 1476453775.237 … и так далее .. А не как 1476453775.235 …, 1476453775.235 … и т. Д. … Которые имеют ту же миллисекунду.
4. @User1212 Ты совершенно прав! Я все перепутал. Я обновил свой ответ правильным решением.
5. @ t_tia: Я ценю ваши усилия, но я не уверен, как вы получили этот результат. Может быть, это зависит от системы. Я использую ubuntu 14.04. Я изменил свой код, как вы упомянули, но все же я получаю: «0.27738220024145366,1476468738.731939 -0.3371623815707159,1476468738.731995,…».. Я получаю больше образцов за каждую миллисекунду: (