Skip to article frontmatterSkip to article content

Quality Controlling Data

Authors
Affiliations
Arizona State University
Brookhaven National Laboratory
Cornell University
Colorado State University
Clemson University
Texas Tech University
Lawrence Berkeley National Laboratory
Argonne National Laboratory
import act
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
from scipy.stats import linregress
import matplotlib.colors as colors
import pandas as pd
import matplotlib.dates as mdates
# Set your username and token here!
username = 'sanielson'
token = '467abc05f4c61fde'

# Set the datastream and start/enddates
datastream_sebs = 'bnfsebsS20.b1'
startdate = '2025-02-07'
enddate = '2025-04-30T23:59:59'

# Use ACT to easily download the data.  Watch for the data citation!  Show some support
# for ARM's instrument experts and cite their data if you use it in a publication
result_sebs = act.discovery.download_arm_data(username, token, datastream_sebs, startdate, enddate)

datastream_ecor = 'bnfecorsfS20.b1'
result_ecor = act.discovery.download_arm_data(username, token, datastream_ecor, startdate, enddate)

datastream_sirs = 'bnfsirsS20.b1'
result_sirs = act.discovery.download_arm_data(username, token, datastream_sirs, startdate, enddate)
[DOWNLOADING] bnfsebsS20.b1.20250220.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250331.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250208.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250304.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250329.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250213.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250306.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250319.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250323.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250401.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250318.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250214.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250207.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250210.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250430.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250311.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250317.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250301.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250322.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250424.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250324.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250209.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250427.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250417.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250307.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250312.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250422.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250217.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250330.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250212.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250219.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250404.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250411.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250429.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250418.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250223.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250425.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250225.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250315.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250216.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250310.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250321.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250316.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250302.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250211.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250303.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250410.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250218.003000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250227.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250221.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250405.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250421.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250314.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250402.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250328.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250226.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250403.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250414.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250308.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250215.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250423.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250428.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250309.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250412.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250420.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250325.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250327.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250407.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250409.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250406.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250320.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250413.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250228.003000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250419.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250416.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250224.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250222.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250305.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250415.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250326.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250426.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250408.000000.cdf
[DOWNLOADING] bnfsebsS20.b1.20250313.000000.cdf

If you use these data to prepare a publication, please cite:

Sullivan, R., Keeler, E., Pal, S., & Kyrouac, J. Surface Energy Balance System
(SEBS), 2025-02-07 to 2025-04-30, Bankhead National Forest, AL, USA; Long-term
Mobile Facility (BNF), Bankhead National Forest, AL, Supplemental facility at
Courtland (S20). Atmospheric Radiation Measurement (ARM) User Facility.
https://doi.org/10.5439/1984921

[DOWNLOADING] bnfecorsfS20.b1.20250303.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250419.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250410.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250430.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250227.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250323.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250327.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250223.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250417.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250324.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250220.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250411.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250219.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250420.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250222.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250225.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250211.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250424.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250405.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250409.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250306.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250305.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250226.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250218.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250416.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250418.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250423.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250315.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250406.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250221.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250328.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250207.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250307.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250313.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250210.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250208.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250302.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250215.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250213.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250228.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250321.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250407.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250330.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250404.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250214.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250401.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250428.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250414.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250217.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250320.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250310.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250403.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250329.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250316.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250319.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250216.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250318.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250421.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250412.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250426.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250427.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250212.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250312.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250311.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250402.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250422.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250331.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250301.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250317.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250309.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250314.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250415.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250408.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250326.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250224.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250325.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250425.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250209.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250322.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250308.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250429.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250212.220000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250413.000000.nc
[DOWNLOADING] bnfecorsfS20.b1.20250304.000000.nc

If you use these data to prepare a publication, please cite:

Sullivan, R., Cook, D., Shi, Y., Keeler, E., & Pal, S. Eddy Correlation Flux
Measurement System (ECORSF), 2025-02-07 to 2025-04-30, Bankhead National Forest,
AL, USA; Long-term Mobile Facility (BNF), Bankhead National Forest, AL,
Supplemental facility at Courtland (S20). Atmospheric Radiation Measurement
(ARM) User Facility. https://doi.org/10.5439/1494128

[DOWNLOADING] bnfsirsS20.b1.20250215.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250421.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250216.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250218.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250209.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250316.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250309.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250208.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250416.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250213.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250217.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250313.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250331.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250312.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250317.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250311.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250210.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250319.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250225.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250223.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250413.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250408.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250402.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250406.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250314.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250219.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250429.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250302.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250328.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250307.010000.nc
[DOWNLOADING] bnfsirsS20.b1.20250428.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250422.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250220.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250226.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250430.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250323.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250426.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250427.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250424.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250227.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250306.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250211.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250221.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250308.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250409.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250324.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250417.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250325.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250212.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250310.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250207.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250415.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250327.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250315.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250407.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250404.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250304.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250419.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250222.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250410.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250318.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250321.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250307.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250414.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250330.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250423.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250405.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250401.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250228.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250320.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250214.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250411.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250412.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250301.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250326.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250305.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250224.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250403.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250425.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250303.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250420.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250329.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250418.000000.nc
[DOWNLOADING] bnfsirsS20.b1.20250322.000000.nc

If you use these data to prepare a publication, please cite:

Sengupta, M., Xie, Y., Jaker, S., Yang, J., Reda, I., Andreas, A., Habte, A., &
Shi, Y. Solar and Infrared Radiation Station for Downwelling and Upwelling
Radiation (SIRS), 2025-02-07 to 2025-04-30, Bankhead National Forest, AL, USA;
Long-term Mobile Facility (BNF), Bankhead National Forest, AL, Supplemental
facility at Courtland (S20). Atmospheric Radiation Measurement (ARM) User
Facility. https://doi.org/10.5439/1475460

# Let's read in the data using ACT and check out the data
ds_sebs = act.io.read_arm_netcdf(result_sebs)
ds_sebs
Loading...
#ECOR has sensible and latent heat flux together
ds_ecor = act.io.read_arm_netcdf(result_ecor)
ds_ecor
Loading...
# Let's read in the data using ACT and check out the data
ds_sirs = act.io.read_arm_netcdf(result_sirs)
ds_sirs
Loading...
#Net Radiation=Incoming-Outgoing Radiation
#=(DS-US)+(DL-UL)

Quality Controlling Data

ARM has multiple methods that it uses to communicate data quality information out to the users. One of these methods is through “embedded QC” variables. These are variables within the file that have information on automated tests that have been applied. Many times, they include Min, Max, and Delta tests but as is the case with the AOS instruments, there can be more complicated tests that are applied.

The results from all these different tests are stored in a single variable using bit-packed QC. We won’t get into the full details here, but it’s a way to communicate the results of multiple tests in a single integer value by utilizing binary and bits! You can learn more about bit-packed QC here but ACT also has many of the tools for working with ARM QC.

Other Sources of Quality Control

ARM also communicates problems with the data quality through Data Quality Reports (DQR). These reports are normally submitted by the instrument mentor when there’s been a problem with the instrument. The categories include:

  • Data Quality Report Categories
    • Missing: Data are not available or set to -9999
    • Suspect: The data are not fully incorrect but there are problems that increases the uncertainty of the values. Data should be used with caution.
    • Bad: The data are incorrect and should not be used.
    • Note: Data notes are a way to communicate information that would be useful to the end user but does not rise to the level of suspect or bad data

Additionally, data quality information can be found in the Instrument Handbooks, which are included on most instrument pages. Here is an example of the MET handbook.

ds_sirs.clean.cleanup()

down_long = 'down_long_hemisp1'
up_long = 'up_long_hemisp'
down_short = 'down_short_hemisp'
up_short = 'up_short_hemisp'

display = act.plotting.TimeSeriesDisplay(ds_sirs, figsize=(15, 10))

# Plot up the variable in the plots
display.plot(down_long, subplot_index=(0,))
display.plot(up_long, subplot_index=(0,))
display.plot(down_short, subplot_index=(0,))
display.plot(up_short, subplot_index=(0,))

# Plot up a day/night background
display.day_night_background(subplot_index=(0,))

# Plot up a day/night background
#display.day_night_background(subplot_index=(0,))
plt.show()
<Figure size 1500x1000 with 1 Axes>
display = act.plotting.TimeSeriesDisplay(ds_sirs, figsize=(15, 10))

# Plot each variable with a label
display.plot(down_long, subplot_index=(0,), label='↓ Longwave')
display.plot(up_long, subplot_index=(0,), label='↑ Longwave')
display.plot(down_short, subplot_index=(0,), label='↓ Shortwave')
display.plot(up_short, subplot_index=(0,), label='↑ Shortwave')

# Add day/night background
display.day_night_background(subplot_index=(0,))

# Show legend manually
display.axes[0].legend(loc='upper right')

plt.show()
<Figure size 1500x1000 with 1 Axes>
net_radiation = (ds_sirs['down_long_hemisp1'] - ds_sirs['up_long_hemisp']) + (ds_sirs['down_short_hemisp'] - ds_sirs['up_short_hemisp'])
#net radiation calculations
net_radiation.plot()
plt.title('Net Radiation')
plt.ylabel('Radiation')
<Figure size 640x480 with 1 Axes>
ds_sebs.clean.cleanup()

soil_flux = 'surface_soil_heat_flux_avg'

display = act.plotting.TimeSeriesDisplay(ds_sebs, figsize=(15, 10))

# Plot up the variable in the plots
display.plot(soil_flux, subplot_index=(0,))

# Plot up a day/night background
display.day_night_background(subplot_index=(0,))

plt.show()
<Figure size 1500x1000 with 1 Axes>
avail_e = net_radiation - ds_sebs['surface_soil_heat_flux_avg']
#net radiation calculations
avail_e.plot()
plt.title('Net Radiation')
plt.ylabel('Radiation')
<Figure size 640x480 with 1 Axes>
ds_ecor.clean.cleanup()

sensible_flux = 'sensible_heat_flux'
latent_flux = 'latent_flux'

display = act.plotting.TimeSeriesDisplay(ds_ecor, figsize=(15, 10))

# Plot up the variable in the plots
display.plot(sensible_flux, subplot_index=(0,), color='red')
display.plot(latent_flux, subplot_index=(0,), color='blue')

# Plot up a day/night background
display.day_night_background(subplot_index=(0,))

# Plot up a day/night background
#display.day_night_background(subplot_index=(0,))
plt.show()
<Figure size 1500x1000 with 1 Axes>
turb_flux = ds_ecor['sensible_heat_flux'] + ds_ecor['latent_flux']
#net radiation calculations
turb_flux.plot()
plt.title('Turbulent Flux')
plt.ylabel('Radiation')
<Figure size 640x480 with 1 Axes>
turb_flux_aligned, avail_e_aligned = xr.align(turb_flux, avail_e, join = 'inner')
# Convert to numpy arrays
x = AvailE_aligned.values
y = Turb_Flux_aligned.values
# Remove NaNs
mask = ~np.isnan(x) & ~np.isnan(y)
x = x[mask]
y = y[mask]
# Fit regression
from scipy.stats import linregress
slope, intercept, r_value, p_value, std_err = linregress(x, y)
# Sort x for clean line plot
sort_idx = np.argsort(x)
x_sorted = x[sort_idx]
y_fit = slope * x_sorted + intercept
# Plot
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
plt.scatter(x, y, alpha=0.6, label='Data')
plt.plot(x_sorted, y_fit, 'r-', label=f'Fit: y = {slope:.2f}x + {intercept:.1f}')
plt.plot([x.min(), x.max()], [x.min(), x.max()], 'k--', label='1:1 line')
plt.xlabel("Available Energy (Rn - G) [W/m²]")
plt.ylabel("Turbulent Flux (H + LE) [W/m²]")
plt.title("Energy Balance Closure at BNF")
plt.legend()
plt.grid(True)
plt.show()
<Figure size 800x600 with 1 Axes>
# --- Step 1: Timezone-aware time-of-day coordinate ---
def add_time_of_day(da):
    utc_times = pd.to_datetime(da.time.values).tz_localize('UTC')
    central_times = utc_times.tz_convert('US/Central')
    rounded = central_times.floor('30min')
    time_of_day_strs = xr.DataArray(rounded.strftime('%H:%M'), coords={'time': da.time}, dims='time')
    return da.assign_coords(time_of_day=time_of_day_strs)

# --- Step 2: Assign to each variable ---
le_td = add_time_of_day(ds_ecor['latent_flux'])
h_td  = add_time_of_day(ds_ecor['sensible_heat_flux'])
rn_td = add_time_of_day(net_radiation)
g_td  = add_time_of_day(ds_sebs['surface_soil_heat_flux_avg'])

# --- Step 3: Group by time-of-day and average ---
le_avg = le_td.groupby('time_of_day').mean('time')
h_avg  = h_td.groupby('time_of_day').mean('time')
rn_avg = rn_td.groupby('time_of_day').mean('time')
g_avg  = g_td.groupby('time_of_day').mean('time')

# --- Step 4: Sort by time ---
def sort_by_time(da):
    parsed = pd.to_datetime(da.time_of_day.values, format='%H:%M')
    sort_idx = np.argsort(parsed)
    return da.isel(time_of_day=sort_idx)

le_avg = sort_by_time(le_avg)
h_avg  = sort_by_time(h_avg)
rn_avg = sort_by_time(rn_avg)
g_avg  = sort_by_time(g_avg)

# --- Step 5: Prepare time axis ---
time_objects = pd.to_datetime(le_avg.time_of_day.values, format='%H:%M')

# --- Step 6: Plot with CUD colors and thicker lines ---
# Color-blind–friendly colors (CUD palette)
colors = {
    'LE': '#E69F00',  # orange
    'H': '#56B4E9',   # sky blue
    'Rn': '#009E73',  # bluish green
    'G': '#D55E00'    # vermillion
}

plt.figure(figsize=(12, 6))
plt.plot(time_objects, le_avg.values, label='Latent Flux', color='black', linestyle='-', linewidth=2.5)
plt.plot(time_objects, h_avg.values, label='Sensible Heat Flux', color='black', linestyle='--', linewidth=2.5)
plt.plot(time_objects, rn_avg.values, label='Net Radiation', color='black', linestyle='-.', linewidth=2.5)
plt.plot(time_objects, g_avg.values, label='Soil Heat Flux', color='black', linestyle=':', linewidth=2.5)

# Format x-axis
ax = plt.gca()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
ax.xaxis.set_major_locator(mdates.HourLocator(interval=2))
plt.xlim([time_objects[0], time_objects[-1]])

plt.xlabel("Time of Day (Central)", fontsize=14)
plt.ylabel("Average Radiation (W/m²)", fontsize=14)
plt.title("Diurnal Cycle at BNF", fontsize=16)
plt.xticks(rotation=45)
plt.legend(fontsize=16)
plt.grid(True)
plt.tight_layout()
plt.show()
<Figure size 1200x600 with 1 Axes>