Search code examples
pythoncsvprintingmilliseconds

print random data for each millisecond python


I want to print random data ranging from -1 to 1 in csv file for each millisecond using Python. I started with to print for each second and it worked. But, I am facing difficulty with printing random data for each millisecond. I want the timestamp to be in UNIX epoch format like "1476449030.55676" (for milliseconds, decimal point is not required)

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()

Solution

  • UPD: time.sleep() accepts argument in seconds, so you don't need to divide it by 1000. After fixing this, my output looks like this:

    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
    

    Which is as good as it gets, given the precision of time.sleep and other time functions.

    Here's a stripped down version, which outputs timestamps into stdout every second:

    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
    

    ================================================

    This is the problem:

    float(tdiff.total_seconds()/1000)
    

    You use integer division, and then convert result to float. Instead, you need to use float division:

    tdiff.total_seconds()/1000.0