Documentation for the data file format of the ???????_data.json files in https://sealevel.info/data/ by Dave Burton, 5/29/2020, updated 1/24/2023 This data is used by https://sealevel.info/MSL_graph.php, https://sealevel.info/MSL_weighted.php, and perhaps other programs. This example is from https://sealevel.info/data/9414290_data.json { "noaa_id":"9414290", // NOAA's site designation: either 7 digits (for NOAA's own gauges), or 3 digit coast, hyphen, 3 digit station (for other PSMSL gauges) "psmsl_id":"10", // PSMSL's new site numbers are simple integers, starting with 1 for Brest, France "coast_stn":"823-031", // PSMSL's old site numbers are: a 3 digit coast number, hyphen, 3 digit station number. NOAA still uses them. "station_name":"San Francisco, CA, USA", // Human-readable station name "noaa_trend":1.99, // NOAA's inear regression result (caution: often obsolete!) "noaa_ci":0.18, // NOAA's linear regression confidence interval (caution: often obsolete!) "noaa_start":1897, // First year of NOAA data for this site "noaa_end":2019, // Last year of NOAA data for this site "lat":37.8063, // Decimal latitude for the location of this tide gauge "lon":-122.4659, // Decimal longitude for the location of this tide gauge "noaa":true, // Does NOAA have seasonally-adjusted data and trend analysis for this site? "noaa_raw":true, // Does NOAA have raw (unadjusted) data for this site? "rlr":true, // Does PSMSL have "rlr" (trustworthy) data for this site? "psmsl_to_noaa_offset":7079, // If both NOAA and PSMSL MSL data exist, PSMSL's is ((NOAA's * 1000) + psmsl_to_noaa_offset) mm // Note: the PSMSL and NOAA data are not always perfectly consistent, but psmsl_to_noaa_offset is robustly chosen to be the "usually correct" conversion factor. // Most locations have a seasonal cycle; this tells us were we got it "seasonal_cycle_source":"NOAA (implied*)", // Possible sources are: // "NOAA (file)" = seasonal signal from NOAA, read from their file, e.g., https://tidesandcurrents.noaa.gov/sltrends/sltrends_station.shtml?plot=seasonal&id=9414290 // "NOAA (implied)" = seasonal signal from NOAA, implied by comparing their raw and adjusted MSL data // "NOAA (consistent)" = seasonal signal from NOAA, and comparing their raw and adjusted MSL data yielded a result identical to their file // "NOAA (implied*)" = seasonal signal from NOAA, implied by comparing their raw and adjusted MSL data; asterisk means it's NOT identical to their seasonal cycle file! // "Computed" = my own computation of the seasonal cycle (used when NOAA did not calculate one) // Here's the seasonal cycle for this site "seasonal_cycle":[0.023, 0.019, -0.021, -0.062, -0.049, -0.022, 0.014, 0.027, 0.040, 0.016, -0.002, 0.013], // August sea-level is highest, and April is lowest, on average, here "suggested_rebase_yr":1854, // for better accuracy when doing regressions, I suggest that you use a more recent baseline than "in the year of our Lord" // These are headings (field names) for the data records in msl_data[] "msl_headers":["year", "month", "NOAA_adjusted_MSL", "NOAA_unverified", "NOAA_linear_trend", "NOAA_high_conf", "NOAA_low_conf", "PSMSL_rlr_MSL", "PSMSL_num_missing_days", "PSMSL_dataflag", "NOAA_raw_MSL", "NOAA_interpolated", "msl_raw", "msl_adj"], // The most important fields are: // 0: year = AD // 1: month = 1-12 for Jan to Dec // 2: NOAA_adjusted_MSL = NOAA's seasonally adjusted monthly mean sea-level, in meters (or null if missing) // 7: PSMSL_rlr_MSL = PSMSL's unadjusted monthly mean sea-level, in millimeters (currently -99999 if missing, but I might change it to null) // 10: NOAA_raw_MSL = NOAA's unadjusted monthly mean sea-level, in meters // 12: raw_msl = monthly mean sea-level, in meters, combined, unadjusted (from NOAA and/or PSMSL, and I hope to add other sources) // 13: adj_msl = monthly mean sea-level, in meters, combined, with the seasonal signal removed (this is probably the one you want) // Note: I might add additional fields, so your code should not fail if there are more than 14 fields. // msl_data[] contains the sea-level data for this site, with the 14 fields specified above. // Note that, where we can, we use NOAA_adj_MSL to fill in gaps in NOAA_raw_MSL, and vice-versa, // by adding or subtracting the seasonal signal, respectively. (You wouldn't think there would // be such inconsistencies, but there often are.) // There will never be months missing from the file (i.e., gaps between records). If months of data // are missing they're represented with year & month but null for all the data fields (except for // PSMSL, field[7], which currently can alternately represent missing data by PSMSL's convention // of -99999, but that might change in a future version). // (*In most cases that's also true of the NOAA and PSMSL input files. But not all! I found // a site [Dahlgren, VA, USA, 8635027] with a gap in NOAA's raw data. So I added code to // mashup_sealevel_data.py to fill in such gaps.) "msl_data":[ [1854, 7, -0.184, null, -0.213, -0.190, -0.236, 6909, 0, "000", -0.170, 0, -0.170, -0.184], [1854, 8, -0.167, null, -0.213, -0.190, -0.236, 6940, 0, "000", -0.140, 0, -0.140, -0.167], [1854, 9, -0.158, null, -0.213, -0.190, -0.236, 6961, 0, "000", -0.118, 0, -0.118, -0.158], [1854, 10, -0.143, null, -0.213, -0.190, -0.235, 6952, 0, "000", -0.127, 0, -0.127, -0.143], [1854, 11, -0.125, null, -0.213, -0.190, -0.235, 6952, 0, "000", -0.127, 0, -0.127, -0.125], [1854, 12, -0.107, null, -0.212, -0.190, -0.235, 6985, 0, "000", -0.094, 0, -0.094, -0.107], [1855, 1, -0.092, null, -0.212, -0.190, -0.235, 7010, 0, "000", -0.069, 0, -0.069, -0.092], ... [2020, 3, 0.070, null, 0.046, 0.059, 0.034, -99999, 0, "000", 0.049, 0, 0.049, 0.070], [2020, 4, 0.036, null, null, null, null, -99999, 0, "000", -0.026, 0, -0.026, 0.036] ] } ------------------------------------------------- Copied from ../MSL_graph.php ... // The 'msl_data' field is an array of records containing a mashup of NOAA and PSMSL data: // year, month 1..12, monthly_MSL, Unverified, Linear_Trend, High_Conf, Low_Conf, PSMS_RLR, no_of_missing_days, flag_bits // msl_data[][2] is NOAA's MSL value, which has already had seasonal trend removed by NOAA, // downloaded from http://tidesandcurrents.noaa.gov/sltrends/downloadMeanSeaLevelTrendsCSV.htm?stnid=$stnid // msl_data[][7] is PSMSL's MSL value, which has NOT had the seasonal trend removed // downloaded from http://www.psmsl.org/data/obtaining/rlr.monthly.data/396.rlrdata // msl_data[][0..6] is from NOAA: // Year, Month, Monthly_MSL, Unverified, Linear_Trend, High_Conf., Low_Conf. // msl_data[][7..9] is from PSMSL: // PSMSL_RLR, no_of_missing_days, flag_bits // Note: we include null/undefined values because if we don't include the null values then Google Charts will interpolate them, which would make a misleading graph