code: def ecef2eci(x, y, z, time: datetime) -> tuple:
      """
      Point => Point   ECEF => ECI
  
      J2000 frame
  
      Parameters
      ----------
  
      x : float
          target x ECEF coordinate
      y : float
          target y ECEF coordinate
      z : float
          target z ECEF coordinate
      time : datetime.datetime
          time of observation
  
      Results
      -------
      x_eci : float
          x ECI coordinate
      y_eci : float
          y ECI coordinate
      z_eci : float
          z ECI coordinate
      """
  
      try:
          itrs = ITRS(
              CartesianRepresentation(x * u.m, y * u.m, z * u.m),
              obstime=time,
          )
          gcrs = itrs.transform_to(GCRS(obstime=time))
          eci = EarthLocation(*gcrs.cartesian.xyz)
  
          x_eci = eci.x.value
          y_eci = eci.y.value
          z_eci = eci.z.value
      except NameError:
          x = np.atleast_1d(x)
          y = np.atleast_1d(y)
          z = np.atleast_1d(z)
          gst = np.atleast_1d(greenwichsrt(juliandate(time)))
          assert x.shape == y.shape == z.shape
          assert x.size == gst.size
  
          ecef = np.column_stack((x.ravel(), y.ravel(), z.ravel()))
          eci = np.empty((x.size, 3))
          for i in range(x.size):
              eci[i, :] = R3(gst[i]).T @ ecef[i, :]
  
          x_eci = eci[:, 0].reshape(x.shape)
          y_eci = eci[:, 1].reshape(y.shape)
          z_eci = eci[:, 2].reshape(z.shape)
  
      return x_eci, y_eci, z_eci
  
imports: from __future__ import annotations
  from datetime import datetime
  import numpy
  from .sidereal import greenwichsrt, juliandate
label_desc: Use image node_id 2 for calling a global function with example usage: ecef2eci(x, y, z, time) and returns: x_eci,  y_eci,  z_eci