简体   繁体   中英

Plot elapsed time on x axis, python panda matplotlib

I try to plot data with a elapsed time hh:mm:ss on x axis. The hh should be a ongoing number (not only 24h). The imported x raw data has the format yyyy-mm-dd hh:mm:ss and the subtraction for x2 works.

import pandas as pd
import matplotlib.pyplot as plt

...

mydata = pd.read_excel(data_path + data_file, skiprows=2)

x = mydata.iloc[17:,0].values
y = mydata.iloc[17:,1].values

x2 = x - x[0]
plt.plot(x2,y)
plt.show()

But there is a datatype problem:

*TypeError: float() argument must be a string or a number, not 'datetime.timedelta'*

How can I solve this? Thanks

I reduced the whole script to the minimun, now I haven't this type error... I have to look in a second step why and when I get this error.

In this next code example there is no error. When I subtract all x values from the x[0] then the values on the x axis aren't in time format, see picture.

import pandas as pd
import matplotlib.pyplot as plt
import time
import datetime
from datetime import timedelta

data_path   = "C:/.../"
data_file = "..."
row_data_start = 0

mydata = pd.read_excel(data_path + data_file, skiprows=2)

x = mydata.iloc[row_data_start:,0].values
y1 = mydata.iloc[row_data_start:,1].values
y5 = mydata.iloc[row_data_start:,4].values
y4 = mydata.iloc[row_data_start:,3].values
 
x = x-x[0]

fig, ax = plt.subplots(ncols=1, nrows=2, dpi=300)

twin1 = ax[0].twinx()
twin1ax1 = ax[1].twinx()

p1, = ax[0].plot(x, y1, ".k-")
p4, = twin1.plot(x, y4, ".b-")
ax[1].plot(x, y5, "r-")

plt.show()

console print(x):

[           0  10000000000  20000000000  30000000000  40000000000
  50000000000  60000000000  70000000000  80000000000  90000000000
 100000000000 110000000000 120000000000 130000000000 140000000000
 150000000000 160000000000 170000000000 180000000000 190000000000
 200000000000]

Variable explorer of the input x values:

0   2022-08-04 08:56:22
1   2022-08-04 08:56:32
2   2022-08-04 08:56:42
.
.
.

在此处输入图像描述

How I can format the elapsed time from x[0] to hh:mm:ss?

You can always fiddle with your own formatters

import matplotlib.pyplot as plt
from matplotlib import ticker
import numpy as np

x = np.linspace( 0, 2.5 * 86400, 35 )
y = np.sin( x * 1e-5)

f = plt.figure()
bx = f.add_subplot( 1, 1, 1 )

def myformat( a, pos=None ):
    hh = a // ( 60 * 60 )
    rest = a % ( 60 * 60 )
    mm = rest // ( 60 )
    ss = int( rest % 60 )
    # ~return "{}:{:02d}:{:02d}".format( int( hh), int(mm), int( ss ) )
    return "{}:{:02d}".format( int( hh), int(mm))

bx.plot( x, y )
n = 5
td = max( x ) // n
base = 60 * 60 * ( td // ( 60 * 60 ) )
mbase = 60 * 20 * ( td // ( 60 * 20 ) )

bx.xaxis.set_major_locator( ticker.IndexLocator( base=base, offset=0 ) )
bx.xaxis.set_minor_locator( ticker.IndexLocator( base=mbase, offset=0 ) )
bx.xaxis.set_major_formatter( myformat )
bx.tick_params( axis='x', rotation=90 )
bx.minorticks_on()
bx.grid()
plt.tight_layout()
plt.show()

showing

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM