EEFxTMS_2F (Equatorial electric field)#
Abstract: Access to the equatorial electric field (level 2 product).
%load_ext watermark
%watermark -i -v -p viresclient,pandas,xarray,matplotlib
Python implementation: CPython
Python version : 3.11.6
IPython version : 8.18.0
viresclient: 0.12.3
pandas : 2.1.3
xarray : 2023.12.0
matplotlib : 3.8.2
from viresclient import SwarmRequest
import datetime as dt
import numpy as np
import matplotlib.pyplot as plt
request = SwarmRequest()
EEFxTMS_2F product information#
Dayside equatorial electric field, sampled at every dayside equator crossing +- 20mins
Documentation:
Check what “EEF” data variables are available#
request.available_collections("EEF", details=False)
{'EEF': ['SW_OPER_EEFATMS_2F', 'SW_OPER_EEFBTMS_2F', 'SW_OPER_EEFCTMS_2F']}
request.available_measurements("EEF")
['EEF', 'EEJ', 'RelErr', 'Flags']
Fetch all the EEF and EEJ values from Bravo during 2016#
request.set_collection("SW_OPER_EEFBTMS_2F")
request.set_products(measurements=["EEF", "EEJ", "Flags"])
data = request.get_between(
dt.datetime(2016,1,1),
dt.datetime(2017,1,1)
)
# The first three and last three source (daily) files
data.sources[:3], data.sources[-3:]
(['SW_OPER_EEFBTMS_2F_20160101T000000_20160101T235959_0305',
'SW_OPER_EEFBTMS_2F_20160102T000000_20160102T235959_0305',
'SW_OPER_EEFBTMS_2F_20160103T000000_20160103T235959_0305'],
['SW_OPER_EEFBTMS_2F_20161229T000000_20161229T235959_0305',
'SW_OPER_EEFBTMS_2F_20161230T000000_20161230T235959_0305',
'SW_OPER_EEFBTMS_2F_20161231T000000_20161231T235959_0305'])
df = data.as_dataframe()
df.head()
EEF | Flags | Latitude | EEJ | Spacecraft | Longitude | |
---|---|---|---|---|---|---|
Timestamp | ||||||
2016-01-01 00:54:18.582250240 | -1.003437 | 0 | 7.236889 | [-7.035791632757655, -10.284245548823328, -1.6... | B | 113.752507 |
2016-01-01 02:29:05.999242240 | -5.886811 | 0 | 7.519415 | [7.69339913827803, 7.32175144542921, 4.9947298... | B | 89.978253 |
2016-01-01 04:03:53.439624960 | -0.402845 | 0 | 6.901753 | [0.21498716587741507, 11.145579690064755, 10.6... | B | 66.180580 |
2016-01-01 05:38:40.856788992 | -0.184914 | 0 | 7.373078 | [1.5063256962779412, 5.265722206556244, 4.6157... | B | 42.411229 |
2016-01-01 07:13:28.198109440 | -0.342591 | 0 | 10.032836 | [-3.2989852027098365, -0.9353105754037763, 1.7... | B | 18.698123 |
ax = df.plot(y="EEF", figsize=(20,10))
ax.set_ylim((-2, 2));
ax.set_ylabel("EEF [mV/m]");

Take a look at the time jumps between entries… Nominally the product should produce one measurement “every dayside equator crossing ±20 minutes”
times = df.index
delta_t_minutes = [t.seconds/60 for t in np.diff(times.to_pydatetime())]
print("Range of time gaps (in minutes) between successive measurements:")
np.unique(np.sort(delta_t_minutes))
Range of time gaps (in minutes) between successive measurements:
array([ 47.3 , 47.46666667, 94.73333333, 94.75 ,
94.76666667, 94.78333333, 142.2 , 189.48333333,
189.5 , 189.51666667, 189.53333333, 189.55 ,
189.56666667, 852.86666667])
Access the EEJ estimate via xarray instead of pandas#
Since the EEJ estimate has both time and latitude dimensions, it is not suited to pandas. Here we load the data as a xarray.Dataset
which better handles n-dimensional data.
ds = data.as_xarray()
ds
<xarray.Dataset> Dimensions: (Timestamp: 5468, EEJ_QDLat: 81) Coordinates: * Timestamp (Timestamp) datetime64[ns] 2016-01-01T00:54:18.582250240 ... ... * EEJ_QDLat (EEJ_QDLat) float64 -20.0 -19.5 -19.0 -18.5 ... 19.0 19.5 20.0 Data variables: Spacecraft (Timestamp) object 'B' 'B' 'B' 'B' 'B' ... 'B' 'B' 'B' 'B' 'B' Longitude (Timestamp) float64 113.8 89.98 66.18 ... -105.3 -129.1 -153.0 EEF (Timestamp) float64 -1.003 -5.887 -0.4028 ... 0.4697 0.5593 Flags (Timestamp) uint16 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 Latitude (Timestamp) float64 7.237 7.519 6.902 ... -7.72 -4.03 -0.77 EEJ (Timestamp, EEJ_QDLat) float64 -7.036 -10.28 ... -5.67 -7.144 Attributes: Sources: ['SW_OPER_EEFBTMS_2F_20160101T000000_20160101T235959_030... MagneticModels: [] AppliedFilters: []
Let’s select a subset (one month) and visualise it:
_ds = ds.sel({"Timestamp": "2016-01"})
fig, ax1 = plt.subplots(nrows=1, figsize=(15,3), sharex=True)
_ds.plot.scatter(x="Timestamp", y="EEJ_QDLat", hue="EEJ", vmax=10, s=1, linewidths=0, ax=ax1)
<matplotlib.collections.PathCollection at 0x7f60985b7b90>
