diff --git a/apps/backend/upload-lambda/src/parsers/__fixtures__/historical.csv b/apps/backend/upload-lambda/src/parsers/__fixtures__/historical.csv new file mode 100644 index 000000000..37add3a57 --- /dev/null +++ b/apps/backend/upload-lambda/src/parsers/__fixtures__/historical.csv @@ -0,0 +1,369 @@ +https://docs.google.com/spreadsheets/d/1cWloMpYHZDGkUFulmeW0g1bY3J97Ts4b/edit,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,, +Month,Month #,Day,High °F,High Year(s),Low °F,Low Year(s),Precip in,Precip Year(s),Snow in,Snow Year(s),Peak Gust mph,Wind Dir,Estimated?,Gust Year(s),Notes,Source text +January,1,1,50,1930,-18,"2014, 1977",6.14,1907,18.5,2019,111,NW,TRUE,2013,SYNTHETIC,HIGH 50 1900 | LOW -18 1963 | PRECIP 6.14 1929 | SNOW 18.5 2019 | PEAK GUST 111e MPH NW 2013 [SYNTHETIC TEST DATA] +January,1,2,44,1994,-16,"2025, 1978",6.37,1922,1,1907,73,NNW,TRUE,1906,,HIGH 44 1957 | LOW -16 1945 | PRECIP 6.37 1924 | SNOW 1.0 1907 | PEAK GUST 73e MPH NNW 1906 [SYNTHETIC TEST DATA] +January,1,3,47,2004,4,1904,3.42,1986,13.8,1977,49,WNW,TRUE,"1967, 1949",TEST,"HIGH 47 1934 | LOW 4 2023 | PRECIP 3.42 2012 | SNOW 13.8 1977 | PEAK GUST 49e MPH WNW 1967, 1949 [SYNTHETIC TEST DATA]" +January,1,4,38,2011,6,2010,2.97,1919,11.1,"1927, 1903",80,NW,TRUE,1979,SYNTHETIC,"HIGH 38 1905 | LOW 6 1959 | PRECIP 2.97 1957 | SNOW 11.1 1927, 1903 | PEAK GUST 80e MPH NW 1979 [SYNTHETIC TEST DATA]" +January,1,5,47,1932,-13,1956,1.87,1997,17.4,1906,38,ENE,FALSE,1980,,"HIGH 47 2011 | LOW -13 1947, 2023 | PRECIP 1.87 2008 | SNOW 17.4 1906 | PEAK GUST 38 MPH ENE 1980 [SYNTHETIC TEST DATA]" +January,1,6,49,2016,3,1939,0.41,1976,6.5,"2019, 1960",70,W,FALSE,2015,SYNTHETIC,"HIGH 49 1980 | LOW 3 1912 | PRECIP 0.41 2005 | SNOW 6.5 2019, 1960 | PEAK GUST 70 MPH W 2015 [SYNTHETIC TEST DATA]" +January,1,7,35,1940,3,1997,0.94,1896,25.9,1920,97,ESE,FALSE,1945,,HIGH 35 1963 | LOW 3 1918 | PRECIP 0.94 2021 | SNOW 25.9 1920 | PEAK GUST 97 MPH ESE 1945 [SYNTHETIC TEST DATA] +January,1,8,49,2013,-9,1978,3.02,1959,13.5,1997,106,E,TRUE,1968,,HIGH 49 1973 | LOW -9 1968 | PRECIP 3.02 1985 | SNOW 13.5 1997 | PEAK GUST 106e MPH E 1968 [SYNTHETIC TEST DATA] +January,1,9,38,1934,9,1933,2.96,"1961, 1908",27.5,1918,40,E,FALSE,1972,SYNTHETIC,"HIGH 38 1915 | LOW 9 2024, 1904 | PRECIP 2.96 1989 | SNOW 27.5 1918 | PEAK GUST 40 MPH E 1972 [SYNTHETIC TEST DATA]" +January,1,10,49,1933,8,1932,2.72,"2014, 1987",14.4,1951,84,SW,FALSE,"1996, 1982",SYNTHETIC,"HIGH 49 1981 | LOW 8 1951 | PRECIP 2.72 1952 | SNOW 14.4 1951 | PEAK GUST 84 MPH SW 1996, 1982 [SYNTHETIC TEST DATA]" +January,1,11,50,1950,-16,2000,4.86,1931,26.9,1981,87,ESE,FALSE,1909,,HIGH 50 1898 | LOW -16 1917 | PRECIP 4.86 1943 | SNOW 26.9 1981 | PEAK GUST 87 MPH ESE 1909 [SYNTHETIC TEST DATA] +January,1,12,39,2022,-16,2015,4.39,2001,18.8,1954,98,NW,FALSE,2023,SYNTHETIC,HIGH 39 1966 | LOW -16 1899 | PRECIP 4.39 1963 | SNOW 18.8 1954 | PEAK GUST 98 MPH NW 2023 [SYNTHETIC TEST DATA] +January,1,13,43,1967,-18,1970,4.90,2017,0.2,1999,110,WNW,TRUE,2008,,"HIGH 43 1966, 1904 | LOW -18 1997 | PRECIP 4.90 2021 | SNOW 0.2 1999 | PEAK GUST 110e MPH WNW 2008 [SYNTHETIC TEST DATA]" +January,1,14,33,1913,-4,1988,3.39,1895,18.5,1997,111,SSE,FALSE,1968,SYNTHETIC,HIGH 33 1898 | LOW -4 1933 | PRECIP 3.39 1917 | SNOW 18.5 1997 | PEAK GUST 111 MPH SSE 1968 [SYNTHETIC TEST DATA] +January,1,15,38,1977,6,1941,5.72,1985,17,1906,53,SSW,FALSE,1987,,"HIGH 38 2004 | LOW 6 1938 | PRECIP 5.72 1885, 1986 | SNOW 17.0 1906 | PEAK GUST 53 MPH SSW 1987 [SYNTHETIC TEST DATA]" +January,1,16,39,2008,-12,1919,5.76,1924,26.3,1961,92,S,TRUE,"1921, 1977",,"HIGH 39 1978 | LOW -12 1949, 1929 | PRECIP 5.76 1975 | SNOW 26.3 1961 | PEAK GUST 92e MPH S 1921, 1977 [SYNTHETIC TEST DATA]" +January,1,17,32,1976,-10,1925,4.12,2010,25.6,"2005, 2023",77,SE,TRUE,1919,SYNTHETIC,"HIGH 32 1910, 2011 | LOW -10 1952 | PRECIP 4.12 1959 | SNOW 25.6 2005, 2023 | PEAK GUST 77e MPH SE 1919 [SYNTHETIC TEST DATA]" +January,1,18,35,1972,-19,1923,3.58,1952,12.6,"1948, 1954",94,ENE,FALSE,1909,,"HIGH 35 1963 | LOW -19 1925 | PRECIP 3.58 1939 | SNOW 12.6 1948, 1954 | PEAK GUST 94 MPH ENE 1909 [SYNTHETIC TEST DATA]" +January,1,19,32,1962,3,2018,3.92,1919,2.8,1950,70,ESE,FALSE,1954,,HIGH 32 2011 | LOW 3 2011 | PRECIP 3.92 1917 | SNOW 2.8 1950 | PEAK GUST 70 MPH ESE 1954 [SYNTHETIC TEST DATA] +January,1,20,45,2018,-13,1997,4.50,1973,18.8,1943,94,NNE,FALSE,1918,,"HIGH 45 1984, 1988 | LOW -13 1979 | PRECIP 4.50 1940 | SNOW 18.8 1943 | PEAK GUST 94 MPH NNE 1918 [SYNTHETIC TEST DATA]" +January,1,21,46,1993,-11,2023,4.24,1996,16.1,1980,70,NW,FALSE,"1918, 1977",,"HIGH 46 2001 | LOW -11 1982 | PRECIP 4.24 2007 | SNOW 16.1 1980 | PEAK GUST 70 MPH NW 1918, 1977 [SYNTHETIC TEST DATA]" +January,1,22,49,2015,9,2000,3.57,1887,8.5,2026,71,S,TRUE,1931,,HIGH 49 1931 | LOW 9 1927 | PRECIP 3.57 1996 | SNOW 8.5 2026 | PEAK GUST 71e MPH S 1931 [SYNTHETIC TEST DATA] +January,1,23,52,1964,4,"1987, 1915",6.40,1999,27,"1958, 1931",109,WNW,TRUE,1904,,"HIGH 52 1985, 1942 | LOW 4 1944 | PRECIP 6.40 1927 | SNOW 27.0 1958, 1931 | PEAK GUST 109e MPH WNW 1904 [SYNTHETIC TEST DATA]" +January,1,24,46,1930,-20,1969,4.57,1987,19.1,"1994, 1954",103,S,FALSE,1980,SYNTHETIC,"HIGH 46 1894 | LOW -20 1913 | PRECIP 4.57 1932 | SNOW 19.1 1994, 1954 | PEAK GUST 103 MPH S 1980 [SYNTHETIC TEST DATA]" +January,1,25,48,2022,10,1977,3.50,1927,26.5,1913,83,WSW,FALSE,"1977, 1917",SYNTHETIC,"HIGH 48 1975 | LOW 10 1925, 1894 | PRECIP 3.50 1886, 1941 | SNOW 26.5 1913 | PEAK GUST 83 MPH WSW 1977, 1917 [SYNTHETIC TEST DATA]" +January,1,26,46,1951,10,2002,0.46,1920,11.6,2007,60,NE,FALSE,1902,,HIGH 46 2011 | LOW 10 1887 | PRECIP 0.46 2015 | SNOW 11.6 2007 | PEAK GUST 60 MPH NE 1902 [SYNTHETIC TEST DATA] +January,1,27,45,1911,9,1931,5.32,1936,18.5,1905,101,SW,FALSE,1897,,"HIGH 45 2023 | LOW 9 1902, 1986 | PRECIP 5.32 2009, 1944 | SNOW 18.5 1905 | PEAK GUST 101 MPH SW 1897 [SYNTHETIC TEST DATA]" +January,1,28,50,"1903, 1983",-12,1997,3.97,1992,2,1997,75,SW,FALSE,1928,TEST,"HIGH 50 1918, 1901 | LOW -12 1888 | PRECIP 3.97 1954 | SNOW 2.0 1997 | PEAK GUST 75 MPH SW 1928 [SYNTHETIC TEST DATA]" +January,1,29,34,1917,-5,1987,2.00,1979,8.3,"1994, 1946",57,SSW,FALSE,1891,TEST,"HIGH 34 1905 | LOW -5 1922 | PRECIP 2.00 1911 | SNOW 8.3 1994, 1946 | PEAK GUST 57 MPH SSW 1891 [SYNTHETIC TEST DATA]" +January,1,30,53,"2006, 1896",-11,1918,3.33,1988,21,"2005, 2021",87,N,FALSE,1983,TEST,"HIGH 53 2013, 1946 | LOW -11 1897 | PRECIP 3.33 1898 | SNOW 21.0 2005, 2021 | PEAK GUST 87 MPH N 1983 [SYNTHETIC TEST DATA]" +January,1,31,51,1913,4,1905,6.07,1915,5.1,2006,79,SE,FALSE,1980,,HIGH 51 2009 | LOW 4 1965 | PRECIP 6.07 1891 | SNOW 5.1 2006 | PEAK GUST 79 MPH SE 1980 [SYNTHETIC TEST DATA] +February,2,1,60,2019,2,1917,2.16,2001,15.1,"1919, 1907",47,W,FALSE,1941,,"HIGH 60 2024 | LOW 2 2010 | PRECIP 2.16 1946 | SNOW 15.1 1919, 1907 | PEAK GUST 47 MPH W 1941 [SYNTHETIC TEST DATA]" +February,2,2,43,1954,-7,1997,1.88,1896,23.5,2002,40,WNW,FALSE,1957,SYNTHETIC,"HIGH 43 2023, 1953 | LOW -7 1908 | PRECIP 1.88 1910 | SNOW 23.5 2002 | PEAK GUST 40 MPH WNW 1957 [SYNTHETIC TEST DATA]" +February,2,3,39,1950,0,1940,4.13,1922,15,1994,95,N,FALSE,1926,TEST,"HIGH 39 1956 | LOW 0 1966, 1905 | PRECIP 4.13 1966, 1929 | SNOW 15.0 1994 | PEAK GUST 95 MPH N 1926 [SYNTHETIC TEST DATA]" +February,2,4,41,"1962, 2011",14,1912,3.61,2024,10.1,1924,114,SE,FALSE,1959,SYNTHETIC,HIGH 41 1972 | LOW 14 1914 | PRECIP 3.61 2023 | SNOW 10.1 1924 | PEAK GUST 114 MPH SE 1959 [SYNTHETIC TEST DATA] +February,2,5,46,1976,-18,1917,0.65,1988,3.6,2016,80,SE,FALSE,1950,SYNTHETIC,HIGH 46 1915 | LOW -18 1892 | PRECIP 0.65 1919 | SNOW 3.6 2016 | PEAK GUST 80 MPH SE 1950 [SYNTHETIC TEST DATA] +February,2,6,40,1978,-17,2017,0.48,1895,23.1,1908,69,SSE,TRUE,1956,,"HIGH 40 2022, 1980 | LOW -17 1903 | PRECIP 0.48 1914, 1900 | SNOW 23.1 1908 | PEAK GUST 69e MPH SSE 1956 [SYNTHETIC TEST DATA]" +February,2,7,38,1902,-8,2014,3.90,1960,9.2,1885,86,NNW,FALSE,1980,,"HIGH 38 1909, 1992 | LOW -8 1956 | PRECIP 3.90 1888 | SNOW 9.2 1885 | PEAK GUST 86 MPH NNW 1980 [SYNTHETIC TEST DATA]" +February,2,8,44,1899,9,1982,5.78,1940,18.6,2008,74,N,FALSE,2012,TEST,HIGH 44 1927 | LOW 9 1891 | PRECIP 5.78 1932 | SNOW 18.6 2008 | PEAK GUST 74 MPH N 2012 [SYNTHETIC TEST DATA] +February,2,9,36,2022,-9,1993,3.43,2012,5.3,"1942, 1902",51,N,TRUE,"2026, 1892",SYNTHETIC,"HIGH 36 2003 | LOW -9 1969 | PRECIP 3.43 2008 | SNOW 5.3 1942, 1902 | PEAK GUST 51e MPH N 2026, 1892 [SYNTHETIC TEST DATA]" +February,2,10,51,1929,-6,"1961, 1913",4.54,1993,17.2,1896,63,NE,FALSE,2020,SYNTHETIC,"HIGH 51 2024 | LOW -6 1946, 1995 | PRECIP 4.54 1926 | SNOW 17.2 1896 | PEAK GUST 63 MPH NE 2020 [SYNTHETIC TEST DATA]" +February,2,11,56,1954,14,"2003, 1944",1.81,"1914, 1931",13.2,1903,63,NW,FALSE,1920,,HIGH 56 1891 | LOW 14 1993 | PRECIP 1.81 1918 | SNOW 13.2 1903 | PEAK GUST 63 MPH NW 1920 [SYNTHETIC TEST DATA] +February,2,12,56,1942,1,1968,3.11,1887,4.3,"1911, 2006",54,SW,FALSE,1952,SYNTHETIC,"HIGH 56 1892 | LOW 1 1915, 1963 | PRECIP 3.11 1906 | SNOW 4.3 1911, 2006 | PEAK GUST 54 MPH SW 1952 [SYNTHETIC TEST DATA]" +February,2,13,36,2008,-2,1955,5.37,1927,7.8,1984,61,SSW,FALSE,1936,,HIGH 36 1905 | LOW -2 2025 | PRECIP 5.37 1989 | SNOW 7.8 1984 | PEAK GUST 61 MPH SSW 1936 [SYNTHETIC TEST DATA] +February,2,14,59,2003,10,1977,1.23,2016,18.9,2004,42,NE,TRUE,1905,,HIGH 59 1932 | LOW 10 1971 | PRECIP 1.23 1931 | SNOW 18.9 2004 | PEAK GUST 42e MPH NE 1905 [SYNTHETIC TEST DATA] +February,2,15,54,"2006, 1889",-17,1913,1.37,1975,4.4,1922,108,NNE,FALSE,1919,TEST,"HIGH 54 2002 | LOW -17 1895, 1913 | PRECIP 1.37 1927, 1913 | SNOW 4.4 1922 | PEAK GUST 108 MPH NNE 1919 [SYNTHETIC TEST DATA]" +February,2,16,49,"1997, 1919",-13,1940,3.38,"1995, 1967",20.8,1921,60,WNW,FALSE,1909,,"HIGH 49 1916 | LOW -13 1958 | PRECIP 3.38 1966, 1979 | SNOW 20.8 1921 | PEAK GUST 60 MPH WNW 1909 [SYNTHETIC TEST DATA]" +February,2,17,40,2023,12,1931,3.23,1917,11.4,1998,80,ENE,TRUE,"1976, 1905",TEST,"HIGH 40 1952 | LOW 12 1996 | PRECIP 3.23 2024, 1911 | SNOW 11.4 1998 | PEAK GUST 80e MPH ENE 1976, 1905 [SYNTHETIC TEST DATA]" +February,2,18,45,1936,12,"1936, 2021",4.58,"1894, 1912",25.1,"1977, 1973",104,NW,TRUE,2011,TEST,"HIGH 45 1887 | LOW 12 1941 | PRECIP 4.58 1976 | SNOW 25.1 1977, 1973 | PEAK GUST 104e MPH NW 2011 [SYNTHETIC TEST DATA]" +February,2,19,55,1917,-5,"1971, 1972",4.67,"1937, 1936",13.7,1910,98,NNW,FALSE,1987,SYNTHETIC,HIGH 55 1918 | LOW -5 2000 | PRECIP 4.67 1894 | SNOW 13.7 1910 | PEAK GUST 98 MPH NNW 1987 [SYNTHETIC TEST DATA] +February,2,20,36,1908,9,1937,1.47,1974,18.6,"1913, 1959",95,SW,FALSE,1886,,"HIGH 36 1940, 1911 | LOW 9 2013 | PRECIP 1.47 2023 | SNOW 18.6 1913, 1959 | PEAK GUST 95 MPH SW 1886 [SYNTHETIC TEST DATA]" +February,2,21,58,"1974, 1928",-7,"1935, 1915",1.52,1949,17.1,1999,72,NNW,FALSE,1991,,"HIGH 58 1946 | LOW -7 1896, 1904 | PRECIP 1.52 1949 | SNOW 17.1 1999 | PEAK GUST 72 MPH NNW 1991 [SYNTHETIC TEST DATA]" +February,2,22,56,1889,-6,2000,5.29,1960,1.6,"2010, 1954",87,SSW,FALSE,1956,TEST,"HIGH 56 1966 | LOW -6 2022, 1909 | PRECIP 5.29 1902 | SNOW 1.6 2010, 1954 | PEAK GUST 87 MPH SSW 1956 [SYNTHETIC TEST DATA]" +February,2,23,41,1998,-18,1977,1.04,1980,23.9,2021,84,ESE,FALSE,1992,,"HIGH 41 1920 | LOW -18 1915 | PRECIP 1.04 1919, 1909 | SNOW 23.9 2021 | PEAK GUST 84 MPH ESE 1992 [SYNTHETIC TEST DATA]" +February,2,24,47,1961,-13,2015,3.26,1900,0.5,1898,115,W,FALSE,"1938, 2023",,"HIGH 47 1963 | LOW -13 2002, 1968 | PRECIP 3.26 2010 | SNOW 0.5 1898 | PEAK GUST 115 MPH W 1938, 2023 [SYNTHETIC TEST DATA]" +February,2,25,53,1886,4,1930,1.51,2010,12.5,2021,63,W,FALSE,1922,,HIGH 53 1894 | LOW 4 2006 | PRECIP 1.51 1988 | SNOW 12.5 2021 | PEAK GUST 63 MPH W 1922 [SYNTHETIC TEST DATA] +February,2,26,50,2011,-4,1963,0.59,1949,19,1949,112,N,FALSE,1911,,"HIGH 50 1912, 1972 | LOW -4 1938 | PRECIP 0.59 1885 | SNOW 19.0 1949 | PEAK GUST 112 MPH N 1911 [SYNTHETIC TEST DATA]" +February,2,27,41,2011,-9,1905,0.46,1980,24.8,"2026, 1907",114,SSW,FALSE,1978,TEST,"HIGH 41 1939 | LOW -9 1961, 1888 | PRECIP 0.46 1970 | SNOW 24.8 2026, 1907 | PEAK GUST 114 MPH SSW 1978 [SYNTHETIC TEST DATA]" +February,2,28,50,1937,0,2017,5.12,1916,22.3,1885,109,WNW,FALSE,1924,,HIGH 50 1997 | LOW 0 1954 | PRECIP 5.12 1888 | SNOW 22.3 1885 | PEAK GUST 109 MPH WNW 1924 [SYNTHETIC TEST DATA] +February,2,29,38,1900,1,1920,6.09,2003,17.8,1919,92,ESE,FALSE,1931,,"HIGH 38 1909 | LOW 1 2024 | PRECIP 6.09 1978, 1982 | SNOW 17.8 1919 | PEAK GUST 92 MPH ESE 1931 [SYNTHETIC TEST DATA]" +March,3,1,72,2008,-6,1963,5.67,2004,0.4,"1917, 1936",70,S,FALSE,1977,SYNTHETIC,"HIGH 72 1931 | LOW -6 2006 | PRECIP 5.67 1949 | SNOW 0.4 1917, 1936 | PEAK GUST 70 MPH S 1977 [SYNTHETIC TEST DATA]" +March,3,2,62,1910,14,1941,4.31,1959,13.3,1890,97,W,FALSE,1955,,HIGH 62 1965 | LOW 14 1955 | PRECIP 4.31 1904 | SNOW 13.3 1890 | PEAK GUST 97 MPH W 1955 [SYNTHETIC TEST DATA] +March,3,3,68,1935,3,1976,2.67,"1987, 1918",6.6,1903,56,ESE,TRUE,1920,,HIGH 68 1902 | LOW 3 1928 | PRECIP 2.67 1916 | SNOW 6.6 1903 | PEAK GUST 56e MPH ESE 1920 [SYNTHETIC TEST DATA] +March,3,4,61,1928,2,1954,6.35,1932,26.5,1963,92,ENE,FALSE,1923,,"HIGH 61 1942 | LOW 2 2011, 1995 | PRECIP 6.35 1925 | SNOW 26.5 1963 | PEAK GUST 92 MPH ENE 1923 [SYNTHETIC TEST DATA]" +March,3,5,59,1962,-4,1971,3.10,2015,28,2011,45,NNE,FALSE,1898,SYNTHETIC,"HIGH 59 1992, 1891 | LOW -4 1939 | PRECIP 3.10 1944 | SNOW 28.0 2011 | PEAK GUST 45 MPH NNE 1898 [SYNTHETIC TEST DATA]" +March,3,6,54,1965,5,1948,1.96,1949,9.9,1987,76,NNW,FALSE,1991,SYNTHETIC,HIGH 54 1973 | LOW 5 1910 | PRECIP 1.96 2014 | SNOW 9.9 1987 | PEAK GUST 76 MPH NNW 1991 [SYNTHETIC TEST DATA] +March,3,7,71,1963,18,1975,3.39,2011,18.5,1933,79,ENE,FALSE,"1900, 1934",TEST,"HIGH 71 1954 | LOW 18 1885 | PRECIP 3.39 1905 | SNOW 18.5 1933 | PEAK GUST 79 MPH ENE 1900, 1934 [SYNTHETIC TEST DATA]" +March,3,8,67,1981,-4,1926,0.90,2021,11.8,"1963, 1996",53,ESE,FALSE,1924,,"HIGH 67 1967 | LOW -4 1912, 1906 | PRECIP 0.90 1904 | SNOW 11.8 1963, 1996 | PEAK GUST 53 MPH ESE 1924 [SYNTHETIC TEST DATA]" +March,3,9,63,"1926, 1998",6,1936,3.79,1984,25.5,1886,58,NE,TRUE,1999,,HIGH 63 2018 | LOW 6 1942 | PRECIP 3.79 1908 | SNOW 25.5 1886 | PEAK GUST 58e MPH NE 1999 [SYNTHETIC TEST DATA] +March,3,10,75,1972,-6,1953,6.06,2002,4.1,1937,49,N,FALSE,"1899, 1950",,"HIGH 75 1978 | LOW -6 1885 | PRECIP 6.06 1919 | SNOW 4.1 1937 | PEAK GUST 49 MPH N 1899, 1950 [SYNTHETIC TEST DATA]" +March,3,11,75,1918,-1,1897,2.31,1896,21.8,1976,42,E,FALSE,1945,SYNTHETIC,HIGH 75 1953 | LOW -1 1894 | PRECIP 2.31 2007 | SNOW 21.8 1976 | PEAK GUST 42 MPH E 1945 [SYNTHETIC TEST DATA] +March,3,12,60,1969,8,1893,1.77,1965,14.9,2011,80,WSW,FALSE,1922,TEST,HIGH 60 1978 | LOW 8 2013 | PRECIP 1.77 1995 | SNOW 14.9 2011 | PEAK GUST 80 MPH WSW 1922 [SYNTHETIC TEST DATA] +March,3,13,54,1963,-1,2001,3.20,"1954, 1889",9.9,1947,45,W,TRUE,1988,SYNTHETIC,"HIGH 54 1985, 2016 | LOW -1 1886 | PRECIP 3.20 2005 | SNOW 9.9 1947 | PEAK GUST 45e MPH W 1988 [SYNTHETIC TEST DATA]" +March,3,14,66,1971,15,"1905, 1918",3.94,1959,26.5,1906,54,NE,FALSE,1907,,HIGH 66 1990 | LOW 15 2008 | PRECIP 3.94 1996 | SNOW 26.5 1906 | PEAK GUST 54 MPH NE 1907 [SYNTHETIC TEST DATA] +March,3,15,57,1985,-6,"1985, 1899",0.90,1891,10.7,"2006, 1904",60,NW,FALSE,2022,TEST,"HIGH 57 1893 | LOW -6 1899, 1966 | PRECIP 0.90 2001 | SNOW 10.7 2006, 1904 | PEAK GUST 60 MPH NW 2022 [SYNTHETIC TEST DATA]" +March,3,16,61,2022,23,1955,4.57,1897,17.7,1963,43,NE,FALSE,1891,,HIGH 61 1932 | LOW 23 1999 | PRECIP 4.57 1905 | SNOW 17.7 1963 | PEAK GUST 43 MPH NE 1891 [SYNTHETIC TEST DATA] +March,3,17,67,1948,10,2023,6.07,2009,12.7,"2021, 2014",93,WNW,TRUE,1954,SYNTHETIC,"HIGH 67 1969 | LOW 10 1969 | PRECIP 6.07 2024 | SNOW 12.7 2021, 2014 | PEAK GUST 93e MPH WNW 1954 [SYNTHETIC TEST DATA]" +March,3,18,54,1888,-3,"1919, 1886",1.15,1960,18.4,1950,93,NNW,FALSE,2015,SYNTHETIC,HIGH 54 1903 | LOW -3 1916 | PRECIP 1.15 2009 | SNOW 18.4 1950 | PEAK GUST 93 MPH NNW 2015 [SYNTHETIC TEST DATA] +March,3,19,69,1967,-8,1999,3.04,1931,5,2020,66,WNW,FALSE,1921,,HIGH 69 2021 | LOW -8 1994 | PRECIP 3.04 1973 | SNOW 5.0 2020 | PEAK GUST 66 MPH WNW 1921 [SYNTHETIC TEST DATA] +March,3,20,55,2014,10,1992,6.22,"1885, 1901",5.9,"1886, 1928",86,S,FALSE,2018,,"HIGH 55 1990 | LOW 10 2010 | PRECIP 6.22 1965 | SNOW 5.9 1886, 1928 | PEAK GUST 86 MPH S 2018 [SYNTHETIC TEST DATA]" +March,3,21,63,1945,17,1987,4.51,2000,18.1,1923,42,ENE,FALSE,1983,TEST,"HIGH 63 1914 | LOW 17 1890, 1964 | PRECIP 4.51 1941 | SNOW 18.1 1923 | PEAK GUST 42 MPH ENE 1983 [SYNTHETIC TEST DATA]" +March,3,22,56,1915,2,1927,0.53,1937,13.1,1915,111,ESE,FALSE,1930,,HIGH 56 1983 | LOW 2 1919 | PRECIP 0.53 1986 | SNOW 13.1 1915 | PEAK GUST 111 MPH ESE 1930 [SYNTHETIC TEST DATA] +March,3,23,60,1940,-7,1963,0.52,"2022, 1964",21.3,"1948, 2021",110,SSE,FALSE,2024,SYNTHETIC,"HIGH 60 1969 | LOW -7 1923 | PRECIP 0.52 1981 | SNOW 21.3 1948, 2021 | PEAK GUST 110 MPH SSE 2024 [SYNTHETIC TEST DATA]" +March,3,24,64,1917,15,1989,3.37,1939,6.2,"1983, 1895",112,SSW,FALSE,1885,,"HIGH 64 1993 | LOW 15 1950 | PRECIP 3.37 2006 | SNOW 6.2 1983, 1895 | PEAK GUST 112 MPH SSW 1885 [SYNTHETIC TEST DATA]" +March,3,25,64,1998,19,1915,3.05,1929,19.6,1936,45,S,FALSE,1940,SYNTHETIC,HIGH 64 1937 | LOW 19 1895 | PRECIP 3.05 1958 | SNOW 19.6 1936 | PEAK GUST 45 MPH S 1940 [SYNTHETIC TEST DATA] +March,3,26,68,1945,-4,1941,2.31,1912,22.2,2010,38,SSW,FALSE,2004,,HIGH 68 1929 | LOW -4 1949 | PRECIP 2.31 1890 | SNOW 22.2 2010 | PEAK GUST 38 MPH SSW 2004 [SYNTHETIC TEST DATA] +March,3,27,51,"1966, 1971",10,1888,5.00,"1986, 1901",14,1945,101,SSE,FALSE,"1972, 1957",,"HIGH 51 1897 | LOW 10 2024 | PRECIP 5.00 1913 | SNOW 14.0 1945 | PEAK GUST 101 MPH SSE 1972, 1957 [SYNTHETIC TEST DATA]" +March,3,28,66,1982,9,"1935, 2021",1.20,1980,5,"1979, 2025",43,S,TRUE,2016,TEST,"HIGH 66 1942 | LOW 9 1915 | PRECIP 1.20 1980 | SNOW 5.0 1979, 2025 | PEAK GUST 43e MPH S 2016 [SYNTHETIC TEST DATA]" +March,3,29,56,1949,-4,1892,1.61,2009,28,1947,98,SE,FALSE,1940,,"HIGH 56 1967, 1890 | LOW -4 1923 | PRECIP 1.61 1964 | SNOW 28.0 1947 | PEAK GUST 98 MPH SE 1940 [SYNTHETIC TEST DATA]" +March,3,30,63,1987,14,1915,4.91,1906,24.6,1891,39,NNE,FALSE,1904,TEST,"HIGH 63 1935, 1970 | LOW 14 1960 | PRECIP 4.91 1948, 1979 | SNOW 24.6 1891 | PEAK GUST 39 MPH NNE 1904 [SYNTHETIC TEST DATA]" +March,3,31,62,1952,11,1979,3.20,1999,7.6,1965,46,NW,FALSE,"1982, 2023",,"HIGH 62 1986 | LOW 11 1927 | PRECIP 3.20 2018 | SNOW 7.6 1965 | PEAK GUST 46 MPH NW 1982, 2023 [SYNTHETIC TEST DATA]" +April,4,1,84,1930,38,1903,4.36,1893,20.1,2013,55,S,FALSE,"1907, 2019",,"HIGH 84 1984 | LOW 38 1947 | PRECIP 4.36 1910 | SNOW 20.1 2013 | PEAK GUST 55 MPH S 1907, 2019 [SYNTHETIC TEST DATA]" +April,4,2,80,1969,25,2018,3.55,1950,19.4,1913,58,NE,TRUE,"1922, 1909",,"HIGH 80 1888, 1953 | LOW 25 1913, 1910 | PRECIP 3.55 1977 | SNOW 19.4 1913 | PEAK GUST 58e MPH NE 1922, 1909 [SYNTHETIC TEST DATA]" +April,4,3,83,1896,18,1961,3.86,"1912, 1930",15.9,1899,44,NNE,FALSE,1897,,HIGH 83 1990 | LOW 18 1983 | PRECIP 3.86 1969 | SNOW 15.9 1899 | PEAK GUST 44 MPH NNE 1897 [SYNTHETIC TEST DATA] +April,4,4,83,1887,21,1925,4.11,"2001, 1906",8,1916,54,WSW,TRUE,2022,,"HIGH 83 2003, 1992 | LOW 21 2019 | PRECIP 4.11 1994 | SNOW 8.0 1916 | PEAK GUST 54e MPH WSW 2022 [SYNTHETIC TEST DATA]" +April,4,5,68,1972,26,1904,4.93,1908,25,1941,45,NNE,FALSE,"1957, 2026",,"HIGH 68 1891 | LOW 26 1999 | PRECIP 4.93 1985 | SNOW 25.0 1941 | PEAK GUST 45 MPH NNE 1957, 2026 [SYNTHETIC TEST DATA]" +April,4,6,66,"1977, 2005",37,1928,1.60,"2005, 1949",2.7,1896,67,NW,FALSE,1899,SYNTHETIC,HIGH 66 1925 | LOW 37 1978 | PRECIP 1.60 1931 | SNOW 2.7 1896 | PEAK GUST 67 MPH NW 1899 [SYNTHETIC TEST DATA] +April,4,7,86,1921,24,"1935, 1982",5.02,1940,8.4,1886,83,S,FALSE,2008,,"HIGH 86 1991 | LOW 24 2018, 1923 | PRECIP 5.02 1927, 1959 | SNOW 8.4 1886 | PEAK GUST 83 MPH S 2008 [SYNTHETIC TEST DATA]" +April,4,8,74,1903,29,1936,2.79,1973,6.7,"1934, 1914",96,ESE,FALSE,2013,SYNTHETIC,"HIGH 74 1914 | LOW 29 1916 | PRECIP 2.79 1927, 1946 | SNOW 6.7 1934, 1914 | PEAK GUST 96 MPH ESE 2013 [SYNTHETIC TEST DATA]" +April,4,9,75,1907,8,"1999, 1933",3.25,1943,4.4,1931,101,NE,FALSE,1891,,HIGH 75 1978 | LOW 8 1902 | PRECIP 3.25 2007 | SNOW 4.4 1931 | PEAK GUST 101 MPH NE 1891 [SYNTHETIC TEST DATA] +April,4,10,88,1969,10,1929,6.21,1925,25.5,1990,64,WNW,FALSE,1958,SYNTHETIC,HIGH 88 1971 | LOW 10 1897 | PRECIP 6.21 1956 | SNOW 25.5 1990 | PEAK GUST 64 MPH WNW 1958 [SYNTHETIC TEST DATA] +April,4,11,67,1990,17,1925,5.68,"1994, 2004",21.2,"1960, 1963",46,ENE,FALSE,"1989, 2025",TEST,"HIGH 67 2002 | LOW 17 1902 | PRECIP 5.68 1956 | SNOW 21.2 1960, 1963 | PEAK GUST 46 MPH ENE 1989, 2025 [SYNTHETIC TEST DATA]" +April,4,12,80,1998,17,"1892, 1991",5.66,1992,12.2,2011,106,NNE,FALSE,1911,,HIGH 80 1983 | LOW 17 1899 | PRECIP 5.66 1910 | SNOW 12.2 2011 | PEAK GUST 106 MPH NNE 1911 [SYNTHETIC TEST DATA] +April,4,13,67,1998,28,1974,5.17,"1919, 2018",7.9,1930,113,ESE,FALSE,1940,TEST,"HIGH 67 1992, 1933 | LOW 28 1926 | PRECIP 5.17 2005 | SNOW 7.9 1930 | PEAK GUST 113 MPH ESE 1940 [SYNTHETIC TEST DATA]" +April,4,14,83,"2023, 2024",18,1894,0.82,1968,10.2,"1994, 1984",41,ESE,FALSE,1975,,"HIGH 83 1992, 1993 | LOW 18 1946 | PRECIP 0.82 1891 | SNOW 10.2 1994, 1984 | PEAK GUST 41 MPH ESE 1975 [SYNTHETIC TEST DATA]" +April,4,15,71,1891,8,1931,2.44,1907,8.5,1969,55,E,FALSE,"1959, 1922",,"HIGH 71 1917, 1888 | LOW 8 2023 | PRECIP 2.44 2015 | SNOW 8.5 1969 | PEAK GUST 55 MPH E 1959, 1922 [SYNTHETIC TEST DATA]" +April,4,16,70,2007,21,1906,5.27,"1971, 1966",8.7,1945,65,ESE,FALSE,1987,,HIGH 70 1930 | LOW 21 1965 | PRECIP 5.27 1988 | SNOW 8.7 1945 | PEAK GUST 65 MPH ESE 1987 [SYNTHETIC TEST DATA] +April,4,17,79,2011,34,1979,5.67,1970,27.9,"2011, 1966",52,ESE,TRUE,1888,SYNTHETIC,"HIGH 79 1918 | LOW 34 1938 | PRECIP 5.67 1978 | SNOW 27.9 2011, 1966 | PEAK GUST 52e MPH ESE 1888 [SYNTHETIC TEST DATA]" +April,4,18,70,1972,19,1968,1.28,"1931, 2010",15.9,1902,89,N,FALSE,1924,,"HIGH 70 1980, 1905 | LOW 19 2001 | PRECIP 1.28 1992 | SNOW 15.9 1902 | PEAK GUST 89 MPH N 1924 [SYNTHETIC TEST DATA]" +April,4,19,64,"2015, 1899",19,1921,5.14,1980,13.9,"1904, 1961",102,E,TRUE,1928,SYNTHETIC,"HIGH 64 1981, 1922 | LOW 19 1912 | PRECIP 5.14 1890 | SNOW 13.9 1904, 1961 | PEAK GUST 102e MPH E 1928 [SYNTHETIC TEST DATA]" +April,4,20,84,"1996, 1924",34,1922,5.20,1959,20.4,1990,98,ENE,FALSE,1907,,HIGH 84 1947 | LOW 34 1989 | PRECIP 5.20 2011 | SNOW 20.4 1990 | PEAK GUST 98 MPH ENE 1907 [SYNTHETIC TEST DATA] +April,4,21,69,1902,39,1919,0.82,"2026, 1991",5.2,1934,75,WSW,FALSE,1929,TEST,"HIGH 69 1981 | LOW 39 1918 | PRECIP 0.82 2016, 1953 | SNOW 5.2 1934 | PEAK GUST 75 MPH WSW 1929 [SYNTHETIC TEST DATA]" +April,4,22,71,1939,39,1895,5.57,1975,18.2,1953,105,WSW,FALSE,1934,,HIGH 71 1987 | LOW 39 1966 | PRECIP 5.57 1888 | SNOW 18.2 1953 | PEAK GUST 105 MPH WSW 1934 [SYNTHETIC TEST DATA] +April,4,23,72,1925,12,1921,1.11,"1930, 1946",21.6,1913,64,NNE,FALSE,2022,,"HIGH 72 1956 | LOW 12 1892, 2001 | PRECIP 1.11 1897 | SNOW 21.6 1913 | PEAK GUST 64 MPH NNE 2022 [SYNTHETIC TEST DATA]" +April,4,24,71,"1907, 1940",35,1921,5.75,2020,4.1,1890,114,SSW,TRUE,"1999, 1940",,"HIGH 71 1957 | LOW 35 1948 | PRECIP 5.75 1922 | SNOW 4.1 1890 | PEAK GUST 114e MPH SSW 1999, 1940 [SYNTHETIC TEST DATA]" +April,4,25,82,1917,29,1923,3.55,1995,18.8,1963,37,S,FALSE,1979,,"HIGH 82 1892, 1975 | LOW 29 1942 | PRECIP 3.55 1931 | SNOW 18.8 1963 | PEAK GUST 37 MPH S 1979 [SYNTHETIC TEST DATA]" +April,4,26,67,1898,24,1904,6.04,"1917, 1971",9.4,2000,60,SSE,TRUE,2021,SYNTHETIC,HIGH 67 1923 | LOW 24 2007 | PRECIP 6.04 1960 | SNOW 9.4 2000 | PEAK GUST 60e MPH SSE 2021 [SYNTHETIC TEST DATA] +April,4,27,66,1970,27,2016,2.23,1955,6.6,1920,104,E,TRUE,"2023, 1988",SYNTHETIC,"HIGH 66 1973 | LOW 27 2015, 1952 | PRECIP 2.23 1930 | SNOW 6.6 1920 | PEAK GUST 104e MPH E 2023, 1988 [SYNTHETIC TEST DATA]" +April,4,28,87,1946,11,1954,1.53,1895,15,1903,114,NW,FALSE,1969,,"HIGH 87 1949, 1904 | LOW 11 1982 | PRECIP 1.53 1928 | SNOW 15.0 1903 | PEAK GUST 114 MPH NW 1969 [SYNTHETIC TEST DATA]" +April,4,29,73,1901,30,1889,4.30,1899,13.7,1926,100,ESE,FALSE,1967,SYNTHETIC,HIGH 73 1963 | LOW 30 1988 | PRECIP 4.30 1932 | SNOW 13.7 1926 | PEAK GUST 100 MPH ESE 1967 [SYNTHETIC TEST DATA] +April,4,30,74,1972,28,1914,1.63,1978,18.3,1945,45,NW,FALSE,1917,,HIGH 74 1898 | LOW 28 2000 | PRECIP 1.63 1964 | SNOW 18.3 1945 | PEAK GUST 45 MPH NW 1917 [SYNTHETIC TEST DATA] +May,5,1,83,1954,38,2001,2.64,"1961, 1920",None,,48,E,FALSE,"1997, 2015",TEST,"HIGH 83 1896 | LOW 38 1982, 1919 | PRECIP 2.64 1928 | SNOW None | PEAK GUST 48 MPH E 1997, 2015 [SYNTHETIC TEST DATA]" +May,5,2,95,1957,34,1942,2.03,"1948, 2018",None,,77,SW,FALSE,1886,TEST,HIGH 95 1897 | LOW 34 2000 | PRECIP 2.03 1972 | SNOW None | PEAK GUST 77 MPH SW 1886 [SYNTHETIC TEST DATA] +May,5,3,96,2004,36,1981,4.14,2001,None,,72,SW,FALSE,1990,TEST,HIGH 96 1988 | LOW 36 1922 | PRECIP 4.14 1913 | SNOW None | PEAK GUST 72 MPH SW 1990 [SYNTHETIC TEST DATA] +May,5,4,82,2004,41,"1961, 1972",0.66,1983,None,,44,ENE,FALSE,1919,,HIGH 82 1902 | LOW 41 1950 | PRECIP 0.66 1906 | SNOW None | PEAK GUST 44 MPH ENE 1919 [SYNTHETIC TEST DATA] +May,5,5,75,1897,46,1980,2.11,"1919, 1968",None,,91,SE,FALSE,1904,,"HIGH 75 1932, 1991 | LOW 46 2021 | PRECIP 2.11 1978 | SNOW None | PEAK GUST 91 MPH SE 1904 [SYNTHETIC TEST DATA]" +May,5,6,83,"2007, 1922",29,1927,2.40,"1924, 1982",None,,41,ESE,FALSE,1999,SYNTHETIC,HIGH 83 1977 | LOW 29 1991 | PRECIP 2.40 2006 | SNOW None | PEAK GUST 41 MPH ESE 1999 [SYNTHETIC TEST DATA] +May,5,7,95,1968,34,"1937, 1925",1.57,1949,None,,103,SSW,FALSE,2010,,HIGH 95 1993 | LOW 34 1911 | PRECIP 1.57 1892 | SNOW None | PEAK GUST 103 MPH SSW 2010 [SYNTHETIC TEST DATA] +May,5,8,94,1962,55,1930,3.41,1970,None,,93,NW,TRUE,"1973, 1896",SYNTHETIC,"HIGH 94 1990 | LOW 55 2016 | PRECIP 3.41 2002, 1950 | SNOW None | PEAK GUST 93e MPH NW 1973, 1896 [SYNTHETIC TEST DATA]" +May,5,9,91,2004,45,2012,1.99,"1939, 1999",None,,68,E,FALSE,1966,SYNTHETIC,HIGH 91 1886 | LOW 45 1932 | PRECIP 1.99 1983 | SNOW None | PEAK GUST 68 MPH E 1966 [SYNTHETIC TEST DATA] +May,5,10,91,1966,56,1985,2.00,1932,None,,80,SSE,FALSE,1963,SYNTHETIC,"HIGH 91 1895 | LOW 56 1935 | PRECIP 2.00 1927, 1885 | SNOW None | PEAK GUST 80 MPH SSE 1963 [SYNTHETIC TEST DATA]" +May,5,11,79,1919,29,1992,3.52,"1968, 1947",None,,103,NW,TRUE,"1963, 1967",,"HIGH 79 1896, 1909 | LOW 29 2010 | PRECIP 3.52 2024 | SNOW None | PEAK GUST 103e MPH NW 1963, 1967 [SYNTHETIC TEST DATA]" +May,5,12,91,"1893, 2000",29,1962,2.91,"1955, 1900",None,,105,NW,FALSE,1956,,"HIGH 91 1932 | LOW 29 1890 | PRECIP 2.91 1917, 1895 | SNOW None | PEAK GUST 105 MPH NW 1956 [SYNTHETIC TEST DATA]" +May,5,13,83,"1900, 1980",38,1923,3.27,1916,None,,49,SW,FALSE,2026,TEST,HIGH 83 2013 | LOW 38 1926 | PRECIP 3.27 1980 | SNOW None | PEAK GUST 49 MPH SW 2026 [SYNTHETIC TEST DATA] +May,5,14,79,2004,31,"1989, 1984",1.19,1965,None,,45,ESE,FALSE,"1965, 2001",,"HIGH 79 1993 | LOW 31 1950 | PRECIP 1.19 1955 | SNOW None | PEAK GUST 45 MPH ESE 1965, 2001 [SYNTHETIC TEST DATA]" +May,5,15,81,1988,35,1907,4.96,"1898, 1886",None,,53,WSW,FALSE,1942,,HIGH 81 1947 | LOW 35 2002 | PRECIP 4.96 1988 | SNOW None | PEAK GUST 53 MPH WSW 1942 [SYNTHETIC TEST DATA] +May,5,16,97,1923,35,1955,5.36,1971,None,,115,NE,FALSE,"1980, 1926",,"HIGH 97 1976 | LOW 35 1941 | PRECIP 5.36 1906 | SNOW None | PEAK GUST 115 MPH NE 1980, 1926 [SYNTHETIC TEST DATA]" +May,5,17,94,1965,47,1961,4.80,"1920, 1899",None,,57,SE,TRUE,1905,,"HIGH 94 1978 | LOW 47 2026 | PRECIP 4.80 1948, 2026 | SNOW None | PEAK GUST 57e MPH SE 1905 [SYNTHETIC TEST DATA]" +May,5,18,82,1994,41,1975,5.66,1899,2.3,2014,49,WSW,FALSE,"1962, 1897",,"HIGH 82 1958 | LOW 41 1895 | PRECIP 5.66 2009 | SNOW 2.3 2014 | PEAK GUST 49 MPH WSW 1962, 1897 [SYNTHETIC TEST DATA]" +May,5,19,83,1981,54,1958,4.87,1940,None,,78,SW,FALSE,1967,TEST,HIGH 83 1973 | LOW 54 1890 | PRECIP 4.87 1938 | SNOW None | PEAK GUST 78 MPH SW 1967 [SYNTHETIC TEST DATA] +May,5,20,89,1944,34,1896,4.91,1990,None,,54,S,FALSE,1949,SYNTHETIC,HIGH 89 1918 | LOW 34 1905 | PRECIP 4.91 1991 | SNOW None | PEAK GUST 54 MPH S 1949 [SYNTHETIC TEST DATA] +May,5,21,97,1965,36,1970,0.64,1983,None,,64,SE,TRUE,1964,,"HIGH 97 1936 | LOW 36 1933, 2003 | PRECIP 0.64 1973 | SNOW None | PEAK GUST 64e MPH SE 1964 [SYNTHETIC TEST DATA]" +May,5,22,92,1956,29,1999,2.74,1921,None,,65,NE,FALSE,1917,,HIGH 92 1996 | LOW 29 1917 | PRECIP 2.74 1926 | SNOW None | PEAK GUST 65 MPH NE 1917 [SYNTHETIC TEST DATA] +May,5,23,85,1954,52,1979,2.88,2021,14.6,"1904, 1925",115,WSW,FALSE,"1942, 1951",SYNTHETIC,"HIGH 85 1977 | LOW 52 1982, 1935 | PRECIP 2.88 1916 | SNOW 14.6 1904, 1925 | PEAK GUST 115 MPH WSW 1942, 1951 [SYNTHETIC TEST DATA]" +May,5,24,97,"2019, 1896",39,1959,5.77,1888,None,,92,SSW,FALSE,1955,,"HIGH 97 2003 | LOW 39 1887, 1991 | PRECIP 5.77 1924, 1976 | SNOW None | PEAK GUST 92 MPH SSW 1955 [SYNTHETIC TEST DATA]" +May,5,25,83,1922,35,1937,2.08,1939,None,,38,WSW,FALSE,2002,TEST,HIGH 83 1956 | LOW 35 1908 | PRECIP 2.08 1990 | SNOW None | PEAK GUST 38 MPH WSW 2002 [SYNTHETIC TEST DATA] +May,5,26,89,1980,27,2003,5.23,"1969, 2006",None,,48,WSW,FALSE,1960,,"HIGH 89 2023 | LOW 27 1919 | PRECIP 5.23 1931, 2014 | SNOW None | PEAK GUST 48 MPH WSW 1960 [SYNTHETIC TEST DATA]" +May,5,27,97,1984,42,1990,1.09,1982,None,,93,W,FALSE,1969,TEST,HIGH 97 2020 | LOW 42 1915 | PRECIP 1.09 1981 | SNOW None | PEAK GUST 93 MPH W 1969 [SYNTHETIC TEST DATA] +May,5,28,95,"1899, 1927",40,1908,1.62,1977,None,,42,NW,FALSE,1971,TEST,HIGH 95 1990 | LOW 40 1997 | PRECIP 1.62 1888 | SNOW None | PEAK GUST 42 MPH NW 1971 [SYNTHETIC TEST DATA] +May,5,29,87,2013,46,2008,2.69,1920,None,,76,SSE,FALSE,2013,,HIGH 87 2018 | LOW 46 1987 | PRECIP 2.69 1895 | SNOW None | PEAK GUST 76 MPH SSE 2013 [SYNTHETIC TEST DATA] +May,5,30,94,2013,38,1914,4.87,1917,None,,89,N,FALSE,1992,TEST,"HIGH 94 1918, 2018 | LOW 38 1973, 1941 | PRECIP 4.87 2009 | SNOW None | PEAK GUST 89 MPH N 1992 [SYNTHETIC TEST DATA]" +May,5,31,82,1918,39,1905,6.08,"1974, 1887",None,,89,SE,TRUE,1951,,HIGH 82 1932 | LOW 39 1993 | PRECIP 6.08 2007 | SNOW None | PEAK GUST 89e MPH SE 1951 [SYNTHETIC TEST DATA] +June,6,1,95,1899,39,2026,2.46,1956,None,,110,SSE,TRUE,1900,,HIGH 95 1917 | LOW 39 1952 | PRECIP 2.46 1919 | SNOW None | PEAK GUST 110e MPH SSE 1900 [SYNTHETIC TEST DATA] +June,6,2,97,"1904, 2010",38,1959,5.48,2023,None,,88,SE,FALSE,1957,,HIGH 97 1961 | LOW 38 1915 | PRECIP 5.48 1892 | SNOW None | PEAK GUST 88 MPH SE 1957 [SYNTHETIC TEST DATA] +June,6,3,94,1902,56,1965,4.77,2002,None,,55,SSW,FALSE,1902,TEST,HIGH 94 1934 | LOW 56 1953 | PRECIP 4.77 1928 | SNOW None | PEAK GUST 55 MPH SSW 1902 [SYNTHETIC TEST DATA] +June,6,4,80,2026,40,1888,2.05,1978,None,,108,SSW,FALSE,1963,TEST,HIGH 80 1987 | LOW 40 1923 | PRECIP 2.05 1982 | SNOW None | PEAK GUST 108 MPH SSW 1963 [SYNTHETIC TEST DATA] +June,6,5,82,1909,57,1969,3.29,1937,None,,84,ESE,TRUE,"1988, 1902",,"HIGH 82 1996 | LOW 57 1913, 2008 | PRECIP 3.29 2016, 2019 | SNOW None | PEAK GUST 84e MPH ESE 1988, 1902 [SYNTHETIC TEST DATA]" +June,6,6,82,"1996, 1940",65,2012,2.52,1968,None,,42,E,FALSE,1953,,HIGH 82 1952 | LOW 65 1928 | PRECIP 2.52 1921 | SNOW None | PEAK GUST 42 MPH E 1953 [SYNTHETIC TEST DATA] +June,6,7,88,"1905, 1902",61,1942,1.52,1908,None,,69,NNW,FALSE,1984,SYNTHETIC,"HIGH 88 1919 | LOW 61 2011, 1943 | PRECIP 1.52 1897 | SNOW None | PEAK GUST 69 MPH NNW 1984 [SYNTHETIC TEST DATA]" +June,6,8,95,1906,51,1917,3.33,2023,None,,62,WNW,FALSE,1988,,HIGH 95 1934 | LOW 51 1996 | PRECIP 3.33 1969 | SNOW None | PEAK GUST 62 MPH WNW 1988 [SYNTHETIC TEST DATA] +June,6,9,98,1989,38,1890,4.93,2011,None,,103,E,FALSE,1935,SYNTHETIC,HIGH 98 1959 | LOW 38 2017 | PRECIP 4.93 1963 | SNOW None | PEAK GUST 103 MPH E 1935 [SYNTHETIC TEST DATA] +June,6,10,95,1905,40,"1980, 1923",1.55,1922,None,,46,SE,FALSE,1993,TEST,"HIGH 95 2001, 1937 | LOW 40 1976 | PRECIP 1.55 2025 | SNOW None | PEAK GUST 46 MPH SE 1993 [SYNTHETIC TEST DATA]" +June,6,11,94,1920,48,"1948, 1963",6.05,1941,None,,45,S,FALSE,1912,,"HIGH 94 1973 | LOW 48 1989, 1935 | PRECIP 6.05 1903 | SNOW None | PEAK GUST 45 MPH S 1912 [SYNTHETIC TEST DATA]" +June,6,12,93,1982,42,1909,1.95,1943,None,,68,W,TRUE,1959,,HIGH 93 2020 | LOW 42 1955 | PRECIP 1.95 1948 | SNOW None | PEAK GUST 68e MPH W 1959 [SYNTHETIC TEST DATA] +June,6,13,91,1947,65,1907,0.40,1913,None,,115,NNW,TRUE,1959,SYNTHETIC,HIGH 91 1921 | LOW 65 2020 | PRECIP 0.40 2010 | SNOW None | PEAK GUST 115e MPH NNW 1959 [SYNTHETIC TEST DATA] +June,6,14,79,2023,54,1921,5.01,1902,None,,83,SW,TRUE,1907,,HIGH 79 1900 | LOW 54 1965 | PRECIP 5.01 1983 | SNOW None | PEAK GUST 83e MPH SW 1907 [SYNTHETIC TEST DATA] +June,6,15,92,1914,55,1904,2.72,1930,None,,78,NNE,FALSE,1889,,HIGH 92 1996 | LOW 55 2001 | PRECIP 2.72 2002 | SNOW None | PEAK GUST 78 MPH NNE 1889 [SYNTHETIC TEST DATA] +June,6,16,92,2000,47,1988,2.70,1985,None,,39,SSE,FALSE,1900,,HIGH 92 2026 | LOW 47 1936 | PRECIP 2.70 1943 | SNOW None | PEAK GUST 39 MPH SSE 1900 [SYNTHETIC TEST DATA] +June,6,17,94,1938,48,1917,2.52,"2001, 1995",None,,111,E,FALSE,"1995, 2016",TEST,"HIGH 94 1922 | LOW 48 1958, 1920 | PRECIP 2.52 1954 | SNOW None | PEAK GUST 111 MPH E 1995, 2016 [SYNTHETIC TEST DATA]" +June,6,18,91,"1924, 1885",50,1978,5.07,1941,None,,74,SSW,FALSE,1905,,HIGH 91 1916 | LOW 50 1898 | PRECIP 5.07 1941 | SNOW None | PEAK GUST 74 MPH SSW 1905 [SYNTHETIC TEST DATA] +June,6,19,91,1931,54,1906,4.95,1987,None,,62,SE,FALSE,"1965, 2011",TEST,"HIGH 91 2020, 2019 | LOW 54 1980 | PRECIP 4.95 1990, 1996 | SNOW None | PEAK GUST 62 MPH SE 1965, 2011 [SYNTHETIC TEST DATA]" +June,6,20,88,1940,52,1938,2.42,1990,None,,93,SW,FALSE,2007,SYNTHETIC,HIGH 88 1914 | LOW 52 1911 | PRECIP 2.42 2018 | SNOW None | PEAK GUST 93 MPH SW 2007 [SYNTHETIC TEST DATA] +June,6,21,91,2010,50,1942,5.04,1976,None,,71,E,TRUE,1972,,HIGH 91 2011 | LOW 50 1968 | PRECIP 5.04 1940 | SNOW None | PEAK GUST 71e MPH E 1972 [SYNTHETIC TEST DATA] +June,6,22,99,2017,37,1903,5.03,"1912, 1968",None,,91,NNW,TRUE,1899,,HIGH 99 2006 | LOW 37 1885 | PRECIP 5.03 1900 | SNOW None | PEAK GUST 91e MPH NNW 1899 [SYNTHETIC TEST DATA] +June,6,23,89,2021,64,1939,2.19,1962,None,,46,SSE,FALSE,1961,,"HIGH 89 1963 | LOW 64 1977 | PRECIP 2.19 1899, 1975 | SNOW None | PEAK GUST 46 MPH SSE 1961 [SYNTHETIC TEST DATA]" +June,6,24,80,1895,54,1936,4.15,"1963, 1961",None,,42,SSW,FALSE,1999,,HIGH 80 1965 | LOW 54 1977 | PRECIP 4.15 1915 | SNOW None | PEAK GUST 42 MPH SSW 1999 [SYNTHETIC TEST DATA] +June,6,25,88,1943,38,2001,0.46,"1971, 2017",None,,84,N,TRUE,1999,SYNTHETIC,"HIGH 88 1919 | LOW 38 1971 | PRECIP 0.46 1948, 1977 | SNOW None | PEAK GUST 84e MPH N 1999 [SYNTHETIC TEST DATA]" +June,6,26,86,1928,60,"1920, 1972",2.16,1956,None,,108,NW,FALSE,2025,,"HIGH 86 1927 | LOW 60 1999 | PRECIP 2.16 1941, 1978 | SNOW None | PEAK GUST 108 MPH NW 2025 [SYNTHETIC TEST DATA]" +June,6,27,85,"1955, 1984",49,1903,2.59,"1939, 2016",None,,60,WSW,FALSE,"2003, 1925",SYNTHETIC,"HIGH 85 1994 | LOW 49 1907 | PRECIP 2.59 1960 | SNOW None | PEAK GUST 60 MPH WSW 2003, 1925 [SYNTHETIC TEST DATA]" +June,6,28,100,1955,42,1961,4.73,1964,None,,40,WSW,FALSE,1970,,"HIGH 100 1968, 2013 | LOW 42 2025 | PRECIP 4.73 2019 | SNOW None | PEAK GUST 40 MPH WSW 1970 [SYNTHETIC TEST DATA]" +June,6,29,89,1990,37,1974,6.31,1971,None,,87,N,FALSE,1953,,HIGH 89 1889 | LOW 37 2007 | PRECIP 6.31 2025 | SNOW None | PEAK GUST 87 MPH N 1953 [SYNTHETIC TEST DATA] +June,6,30,97,"1890, 1951",36,2013,2.17,1971,None,,62,E,TRUE,1993,,"HIGH 97 1955, 1971 | LOW 36 1993 | PRECIP 2.17 1988 | SNOW None | PEAK GUST 62e MPH E 1993 [SYNTHETIC TEST DATA]" +July,7,1,90,1945,67,1999,3.41,1919,None,,110,SW,FALSE,1976,SYNTHETIC,"HIGH 90 1951, 1894 | LOW 67 2012 | PRECIP 3.41 2001 | SNOW None | PEAK GUST 110 MPH SW 1976 [SYNTHETIC TEST DATA]" +July,7,2,85,"1887, 1918",59,1977,4.31,"1943, 1986",None,,74,E,FALSE,1965,,"HIGH 85 2011 | LOW 59 1950, 2000 | PRECIP 4.31 1946 | SNOW None | PEAK GUST 74 MPH E 1965 [SYNTHETIC TEST DATA]" +July,7,3,79,1905,55,2006,3.34,1970,None,,62,NW,FALSE,1957,,"HIGH 79 2002 | LOW 55 1922 | PRECIP 3.34 1894, 1891 | SNOW None | PEAK GUST 62 MPH NW 1957 [SYNTHETIC TEST DATA]" +July,7,4,98,1993,48,1986,5.35,2025,None,,91,ESE,FALSE,2017,TEST,"HIGH 98 1972, 1948 | LOW 48 1919 | PRECIP 5.35 1983, 2000 | SNOW None | PEAK GUST 91 MPH ESE 2017 [SYNTHETIC TEST DATA]" +July,7,5,96,1944,48,"1913, 1908",5.35,2009,None,,111,SSW,FALSE,1946,,"HIGH 96 2011 | LOW 48 1986, 1907 | PRECIP 5.35 1959 | SNOW None | PEAK GUST 111 MPH SSW 1946 [SYNTHETIC TEST DATA]" +July,7,6,81,1969,61,1941,0.69,1947,None,,88,E,TRUE,1949,TEST,HIGH 81 1970 | LOW 61 1896 | PRECIP 0.69 1963 | SNOW None | PEAK GUST 88e MPH E 1949 [SYNTHETIC TEST DATA] +July,7,7,92,2022,53,2011,5.85,1935,None,,52,SSW,TRUE,1889,,"HIGH 92 1962 | LOW 53 1963, 1889 | PRECIP 5.85 2011 | SNOW None | PEAK GUST 52e MPH SSW 1889 [SYNTHETIC TEST DATA]" +July,7,8,81,1937,64,1982,2.51,1918,None,,36,ESE,TRUE,1922,SYNTHETIC,HIGH 81 1973 | LOW 64 1903 | PRECIP 2.51 2005 | SNOW None | PEAK GUST 36e MPH ESE 1922 [SYNTHETIC TEST DATA] +July,7,9,86,"1892, 1954",57,1912,5.19,1894,None,,45,NNE,FALSE,1951,,HIGH 86 1889 | LOW 57 1992 | PRECIP 5.19 2006 | SNOW None | PEAK GUST 45 MPH NNE 1951 [SYNTHETIC TEST DATA] +July,7,10,91,"1917, 1938",60,2008,6.15,1885,None,,94,ESE,FALSE,1895,,HIGH 91 1933 | LOW 60 1971 | PRECIP 6.15 1941 | SNOW None | PEAK GUST 94 MPH ESE 1895 [SYNTHETIC TEST DATA] +July,7,11,90,1899,57,1938,5.62,1898,None,,80,N,FALSE,1893,,"HIGH 90 2008, 1994 | LOW 57 1904 | PRECIP 5.62 1998 | SNOW None | PEAK GUST 80 MPH N 1893 [SYNTHETIC TEST DATA]" +July,7,12,79,1888,67,1966,4.59,"2012, 1935",None,,93,ENE,FALSE,1986,,HIGH 79 1931 | LOW 67 1893 | PRECIP 4.59 1946 | SNOW None | PEAK GUST 93 MPH ENE 1986 [SYNTHETIC TEST DATA] +July,7,13,86,1924,73,1942,3.35,1965,None,,38,SW,FALSE,1953,,"HIGH 86 1914 | LOW 73 1948, 1921 | PRECIP 3.35 1981 | SNOW None | PEAK GUST 38 MPH SW 1953 [SYNTHETIC TEST DATA]" +July,7,14,88,"1929, 2016",71,"1914, 1906",0.47,1949,None,,76,NW,TRUE,"1929, 1886",,"HIGH 88 1910, 1950 | LOW 71 1885 | PRECIP 0.47 1907, 1888 | SNOW None | PEAK GUST 76e MPH NW 1929, 1886 [SYNTHETIC TEST DATA]" +July,7,15,82,"1885, 2012",73,"1919, 1934",0.41,2007,None,,49,ENE,FALSE,1887,,HIGH 82 2026 | LOW 73 1944 | PRECIP 0.41 1955 | SNOW None | PEAK GUST 49 MPH ENE 1887 [SYNTHETIC TEST DATA] +July,7,16,93,1891,56,1953,4.21,1979,None,,93,S,FALSE,1926,,HIGH 93 1958 | LOW 56 1888 | PRECIP 4.21 1921 | SNOW None | PEAK GUST 93 MPH S 1926 [SYNTHETIC TEST DATA] +July,7,17,89,1993,71,1899,0.42,2010,None,,80,WSW,FALSE,1929,,"HIGH 89 2001 | LOW 71 1981, 1977 | PRECIP 0.42 1962 | SNOW None | PEAK GUST 80 MPH WSW 1929 [SYNTHETIC TEST DATA]" +July,7,18,90,1943,66,1910,2.96,1920,None,,97,WSW,FALSE,1990,,"HIGH 90 2018, 1940 | LOW 66 1968 | PRECIP 2.96 1921 | SNOW None | PEAK GUST 97 MPH WSW 1990 [SYNTHETIC TEST DATA]" +July,7,19,100,1917,42,1930,3.75,2012,None,,69,ENE,TRUE,1960,TEST,HIGH 100 1921 | LOW 42 2008 | PRECIP 3.75 1956 | SNOW None | PEAK GUST 69e MPH ENE 1960 [SYNTHETIC TEST DATA] +July,7,20,88,"1922, 1950",43,1907,3.16,1904,None,,112,W,TRUE,1932,,"HIGH 88 1898 | LOW 43 1920 | PRECIP 3.16 1992, 1890 | SNOW None | PEAK GUST 112e MPH W 1932 [SYNTHETIC TEST DATA]" +July,7,21,95,1963,67,2000,2.39,"1926, 1925",None,,53,NW,FALSE,1971,SYNTHETIC,HIGH 95 1948 | LOW 67 2013 | PRECIP 2.39 1940 | SNOW None | PEAK GUST 53 MPH NW 1971 [SYNTHETIC TEST DATA] +July,7,22,93,1962,51,1985,1.94,2003,None,,98,W,FALSE,1964,,HIGH 93 1925 | LOW 51 1888 | PRECIP 1.94 1942 | SNOW None | PEAK GUST 98 MPH W 1964 [SYNTHETIC TEST DATA] +July,7,23,94,"1965, 1981",66,1998,4.09,1982,None,,77,WSW,FALSE,2011,,"HIGH 94 1998 | LOW 66 2007 | PRECIP 4.09 1941, 2023 | SNOW None | PEAK GUST 77 MPH WSW 2011 [SYNTHETIC TEST DATA]" +July,7,24,88,1943,73,1986,0.35,1923,None,,63,WNW,TRUE,1952,SYNTHETIC,HIGH 88 1916 | LOW 73 1906 | PRECIP 0.35 1893 | SNOW None | PEAK GUST 63e MPH WNW 1952 [SYNTHETIC TEST DATA] +July,7,25,100,1949,66,1973,4.61,1975,None,,60,SE,FALSE,1942,,HIGH 100 1973 | LOW 66 1963 | PRECIP 4.61 1899 | SNOW None | PEAK GUST 60 MPH SE 1942 [SYNTHETIC TEST DATA] +July,7,26,83,1944,67,1885,1.20,2025,None,,37,SSW,FALSE,1934,SYNTHETIC,"HIGH 83 1960, 2012 | LOW 67 1888, 1940 | PRECIP 1.20 1892 | SNOW None | PEAK GUST 37 MPH SSW 1934 [SYNTHETIC TEST DATA]" +July,7,27,80,"1937, 1978",58,1945,3.29,1950,None,,38,SSW,FALSE,1981,SYNTHETIC,HIGH 80 1982 | LOW 58 2021 | PRECIP 3.29 1897 | SNOW None | PEAK GUST 38 MPH SSW 1981 [SYNTHETIC TEST DATA] +July,7,28,99,1916,58,1980,5.56,1930,None,,63,NW,FALSE,1950,,"HIGH 99 2026, 1992 | LOW 58 1967 | PRECIP 5.56 2017 | SNOW None | PEAK GUST 63 MPH NW 1950 [SYNTHETIC TEST DATA]" +July,7,29,91,2021,57,1916,4.80,2014,None,,68,ENE,FALSE,"1985, 1963",TEST,"HIGH 91 1988 | LOW 57 1998 | PRECIP 4.80 2010 | SNOW None | PEAK GUST 68 MPH ENE 1985, 1963 [SYNTHETIC TEST DATA]" +July,7,30,87,1997,49,"1940, 1955",5.93,2015,None,,110,WSW,TRUE,2011,,HIGH 87 1895 | LOW 49 1916 | PRECIP 5.93 2016 | SNOW None | PEAK GUST 110e MPH WSW 2011 [SYNTHETIC TEST DATA] +July,7,31,94,1894,69,1983,0.42,1963,None,,50,ENE,TRUE,1912,,HIGH 94 1888 | LOW 69 2003 | PRECIP 0.42 1911 | SNOW None | PEAK GUST 50e MPH ENE 1912 [SYNTHETIC TEST DATA] +August,8,1,85,"1934, 1998",47,2025,5.62,1967,None,,115,SW,FALSE,1916,,"HIGH 85 2005, 2006 | LOW 47 1956 | PRECIP 5.62 1901, 2008 | SNOW None | PEAK GUST 115 MPH SW 1916 [SYNTHETIC TEST DATA]" +August,8,2,89,1892,61,2007,6.28,1903,None,,40,SW,TRUE,1978,TEST,"HIGH 89 1931 | LOW 61 1914, 1974 | PRECIP 6.28 2003 | SNOW None | PEAK GUST 40e MPH SW 1978 [SYNTHETIC TEST DATA]" +August,8,3,97,1958,40,1969,0.46,1906,None,,39,WNW,TRUE,1953,,"HIGH 97 1892, 1914 | LOW 40 1956 | PRECIP 0.46 1921, 1905 | SNOW None | PEAK GUST 39e MPH WNW 1953 [SYNTHETIC TEST DATA]" +August,8,4,88,"1905, 1918",66,1966,0.62,1944,None,,58,ENE,FALSE,"1967, 1996",SYNTHETIC,"HIGH 88 1945 | LOW 66 1886 | PRECIP 0.62 1927 | SNOW None | PEAK GUST 58 MPH ENE 1967, 1996 [SYNTHETIC TEST DATA]" +August,8,5,93,2004,62,"1926, 1945",0.90,2002,None,,58,ENE,TRUE,1940,,"HIGH 93 1920, 1886 | LOW 62 1929 | PRECIP 0.90 1963 | SNOW None | PEAK GUST 58e MPH ENE 1940 [SYNTHETIC TEST DATA]" +August,8,6,88,"2024, 1985",55,1940,0.87,1900,None,,95,SW,FALSE,1918,SYNTHETIC,HIGH 88 1944 | LOW 55 1949 | PRECIP 0.87 1992 | SNOW None | PEAK GUST 95 MPH SW 1918 [SYNTHETIC TEST DATA] +August,8,7,89,"2022, 1980",65,1985,4.13,1957,None,,85,S,FALSE,2008,,HIGH 89 1975 | LOW 65 1940 | PRECIP 4.13 1907 | SNOW None | PEAK GUST 85 MPH S 2008 [SYNTHETIC TEST DATA] +August,8,8,82,2021,59,1998,4.57,1913,None,,82,WSW,FALSE,1956,SYNTHETIC,HIGH 82 1922 | LOW 59 1919 | PRECIP 4.57 2026 | SNOW None | PEAK GUST 82 MPH WSW 1956 [SYNTHETIC TEST DATA] +August,8,9,97,2026,54,1906,5.59,1919,None,,57,W,FALSE,1942,,"HIGH 97 1924 | LOW 54 1893, 1996 | PRECIP 5.59 1942 | SNOW None | PEAK GUST 57 MPH W 1942 [SYNTHETIC TEST DATA]" +August,8,10,80,2008,49,"2006, 1897",2.38,"2024, 1919",None,,60,NW,FALSE,1935,,"HIGH 80 1980, 2011 | LOW 49 1949 | PRECIP 2.38 1908, 1948 | SNOW None | PEAK GUST 60 MPH NW 1935 [SYNTHETIC TEST DATA]" +August,8,11,87,1933,48,1950,0.70,1914,None,,64,E,FALSE,"1978, 1963",,"HIGH 87 1964 | LOW 48 1924 | PRECIP 0.70 2015 | SNOW None | PEAK GUST 64 MPH E 1978, 1963 [SYNTHETIC TEST DATA]" +August,8,12,88,1970,62,1959,5.65,1912,None,,56,SSE,FALSE,1897,,HIGH 88 2026 | LOW 62 1895 | PRECIP 5.65 1939 | SNOW None | PEAK GUST 56 MPH SSE 1897 [SYNTHETIC TEST DATA] +August,8,13,98,2007,49,"1905, 1945",3.24,2012,None,,63,S,FALSE,1997,,HIGH 98 1973 | LOW 49 1913 | PRECIP 3.24 2001 | SNOW None | PEAK GUST 63 MPH S 1997 [SYNTHETIC TEST DATA] +August,8,14,98,1924,47,"1983, 1977",5.19,1968,None,,52,SW,TRUE,"1966, 1930",SYNTHETIC,"HIGH 98 1989 | LOW 47 1957 | PRECIP 5.19 1927 | SNOW None | PEAK GUST 52e MPH SW 1966, 1930 [SYNTHETIC TEST DATA]" +August,8,15,81,1927,67,1987,2.52,1904,None,,55,NNW,FALSE,1938,,HIGH 81 1912 | LOW 67 2010 | PRECIP 2.52 1908 | SNOW None | PEAK GUST 55 MPH NNW 1938 [SYNTHETIC TEST DATA] +August,8,16,85,1917,72,1972,1.53,"1889, 1962",None,,80,SE,FALSE,"1907, 1937",SYNTHETIC,"HIGH 85 1948 | LOW 72 2022 | PRECIP 1.53 1957 | SNOW None | PEAK GUST 80 MPH SE 1907, 1937 [SYNTHETIC TEST DATA]" +August,8,17,90,1931,64,2005,3.37,1894,None,,101,SSW,FALSE,2001,SYNTHETIC,HIGH 90 1987 | LOW 64 1972 | PRECIP 3.37 1998 | SNOW None | PEAK GUST 101 MPH SSW 2001 [SYNTHETIC TEST DATA] +August,8,18,93,2011,45,2009,2.14,"1912, 1927",None,,110,NE,TRUE,"2000, 1905",,"HIGH 93 1956 | LOW 45 2021, 1907 | PRECIP 2.14 2025 | SNOW None | PEAK GUST 110e MPH NE 2000, 1905 [SYNTHETIC TEST DATA]" +August,8,19,83,1931,42,1905,5.60,2024,None,,110,E,FALSE,"1931, 2006",SYNTHETIC,"HIGH 83 1976 | LOW 42 1963 | PRECIP 5.60 1981 | SNOW None | PEAK GUST 110 MPH E 1931, 2006 [SYNTHETIC TEST DATA]" +August,8,20,94,"1993, 1947",41,1914,4.63,1919,None,,43,SE,FALSE,"1950, 1963",,"HIGH 94 1921 | LOW 41 1941 | PRECIP 4.63 1899 | SNOW None | PEAK GUST 43 MPH SE 1950, 1963 [SYNTHETIC TEST DATA]" +August,8,21,93,1900,65,1888,5.20,1885,None,,35,NE,FALSE,2007,,HIGH 93 2010 | LOW 65 1899 | PRECIP 5.20 1973 | SNOW None | PEAK GUST 35 MPH NE 2007 [SYNTHETIC TEST DATA] +August,8,22,98,1920,68,1935,0.99,1960,None,,39,N,FALSE,1930,SYNTHETIC,HIGH 98 1916 | LOW 68 1910 | PRECIP 0.99 1917 | SNOW None | PEAK GUST 39 MPH N 1930 [SYNTHETIC TEST DATA] +August,8,23,83,"1911, 1892",69,1976,4.86,1966,None,,111,N,FALSE,2015,TEST,"HIGH 83 1916, 1970 | LOW 69 1889 | PRECIP 4.86 1998, 2018 | SNOW None | PEAK GUST 111 MPH N 2015 [SYNTHETIC TEST DATA]" +August,8,24,81,1891,50,1914,3.67,1974,None,,81,NNE,FALSE,1974,,"HIGH 81 1975, 1946 | LOW 50 1919 | PRECIP 3.67 1887 | SNOW None | PEAK GUST 81 MPH NNE 1974 [SYNTHETIC TEST DATA]" +August,8,25,92,1958,63,1966,3.33,1930,None,,82,ENE,FALSE,1911,TEST,HIGH 92 1910 | LOW 63 1943 | PRECIP 3.33 2022 | SNOW None | PEAK GUST 82 MPH ENE 1911 [SYNTHETIC TEST DATA] +August,8,26,88,1939,65,1924,3.34,"1975, 1989",None,,57,SE,FALSE,"1969, 1964",,"HIGH 88 1975 | LOW 65 1915 | PRECIP 3.34 1900 | SNOW None | PEAK GUST 57 MPH SE 1969, 1964 [SYNTHETIC TEST DATA]" +August,8,27,83,1950,58,2018,4.45,"1956, 1964",None,,65,SSW,FALSE,1924,,"HIGH 83 1956 | LOW 58 1990, 1945 | PRECIP 4.45 1909 | SNOW None | PEAK GUST 65 MPH SSW 1924 [SYNTHETIC TEST DATA]" +August,8,28,100,1922,71,1999,5.88,2007,None,,107,E,FALSE,"1992, 1907",,"HIGH 100 1893 | LOW 71 1961, 1930 | PRECIP 5.88 1990 | SNOW None | PEAK GUST 107 MPH E 1992, 1907 [SYNTHETIC TEST DATA]" +August,8,29,94,1959,69,"1953, 1903",4.51,2002,None,,96,ESE,TRUE,2019,TEST,"HIGH 94 1975 | LOW 69 1940, 2003 | PRECIP 4.51 1945 | SNOW None | PEAK GUST 96e MPH ESE 2019 [SYNTHETIC TEST DATA]" +August,8,30,84,1917,43,1911,1.49,1978,None,,114,SSW,FALSE,1888,TEST,HIGH 84 2017 | LOW 43 1987 | PRECIP 1.49 1929 | SNOW None | PEAK GUST 114 MPH SSW 1888 [SYNTHETIC TEST DATA] +August,8,31,95,"1887, 1902",53,"1928, 2019",5.20,1948,None,,106,ESE,FALSE,1892,,HIGH 95 1950 | LOW 53 1955 | PRECIP 5.20 1896 | SNOW None | PEAK GUST 106 MPH ESE 1892 [SYNTHETIC TEST DATA] +September,9,1,85,1968,33,1951,2.66,1906,None,,104,ENE,FALSE,"2005, 1919",,"HIGH 85 2024 | LOW 33 1898 | PRECIP 2.66 1887 | SNOW None | PEAK GUST 104 MPH ENE 2005, 1919 [SYNTHETIC TEST DATA]" +September,9,2,73,1915,54,"2003, 1943",4.08,1903,None,,96,E,TRUE,1982,TEST,HIGH 73 1985 | LOW 54 1891 | PRECIP 4.08 1890 | SNOW None | PEAK GUST 96e MPH E 1982 [SYNTHETIC TEST DATA] +September,9,3,93,1887,54,1928,4.35,1981,None,,56,SE,TRUE,1926,,"HIGH 93 2018, 1933 | LOW 54 1945, 1941 | PRECIP 4.35 1989 | SNOW None | PEAK GUST 56e MPH SE 1926 [SYNTHETIC TEST DATA]" +September,9,4,95,1904,51,"1893, 1924",5.77,1915,None,,45,NW,FALSE,"1986, 1933",TEST,"HIGH 95 1930, 1905 | LOW 51 1992 | PRECIP 5.77 2024 | SNOW None | PEAK GUST 45 MPH NW 1986, 1933 [SYNTHETIC TEST DATA]" +September,9,5,89,1914,40,2020,5.37,1985,None,,89,ESE,FALSE,2018,,HIGH 89 1940 | LOW 40 1985 | PRECIP 5.37 2001 | SNOW None | PEAK GUST 89 MPH ESE 2018 [SYNTHETIC TEST DATA] +September,9,6,86,1972,31,2001,4.43,2020,None,,96,SW,FALSE,1948,,"HIGH 86 1930 | LOW 31 1891, 1955 | PRECIP 4.43 1900 | SNOW None | PEAK GUST 96 MPH SW 1948 [SYNTHETIC TEST DATA]" +September,9,7,93,1914,42,1986,5.34,1993,None,,62,N,FALSE,2015,,HIGH 93 2020 | LOW 42 2010 | PRECIP 5.34 1968 | SNOW None | PEAK GUST 62 MPH N 2015 [SYNTHETIC TEST DATA] +September,9,8,85,1958,32,1899,3.42,1929,None,,99,NNE,FALSE,2003,,HIGH 85 1914 | LOW 32 1980 | PRECIP 3.42 2003 | SNOW None | PEAK GUST 99 MPH NNE 2003 [SYNTHETIC TEST DATA] +September,9,9,94,"2019, 1896",50,1926,4.76,"1930, 1949",None,,67,N,FALSE,1940,,"HIGH 94 1929 | LOW 50 1886, 2015 | PRECIP 4.76 1970, 2011 | SNOW None | PEAK GUST 67 MPH N 1940 [SYNTHETIC TEST DATA]" +September,9,10,74,1994,33,2008,3.42,1943,None,,39,SSW,FALSE,2018,SYNTHETIC,HIGH 74 1893 | LOW 33 1949 | PRECIP 3.42 1895 | SNOW None | PEAK GUST 39 MPH SSW 2018 [SYNTHETIC TEST DATA] +September,9,11,81,"1889, 1897",55,"1903, 1967",6.11,"1904, 1934",None,,101,WSW,FALSE,"1983, 2016",,"HIGH 81 1928 | LOW 55 1976 | PRECIP 6.11 1896 | SNOW None | PEAK GUST 101 MPH WSW 1983, 2016 [SYNTHETIC TEST DATA]" +September,9,12,84,1939,51,2025,3.63,2005,None,,61,WSW,FALSE,1988,TEST,HIGH 84 1903 | LOW 51 1921 | PRECIP 3.63 2003 | SNOW None | PEAK GUST 61 MPH WSW 1988 [SYNTHETIC TEST DATA] +September,9,13,76,"1943, 1887",53,1957,0.63,1894,None,,114,NNW,FALSE,2003,,HIGH 76 1975 | LOW 53 2026 | PRECIP 0.63 1891 | SNOW None | PEAK GUST 114 MPH NNW 2003 [SYNTHETIC TEST DATA] +September,9,14,88,1899,51,1900,2.99,1925,None,,75,SW,FALSE,2026,,HIGH 88 1996 | LOW 51 1885 | PRECIP 2.99 1957 | SNOW None | PEAK GUST 75 MPH SW 2026 [SYNTHETIC TEST DATA] +September,9,15,91,1913,54,1967,6.44,2008,None,,102,SW,FALSE,"1931, 1885",,"HIGH 91 1969 | LOW 54 2019 | PRECIP 6.44 1913, 1901 | SNOW None | PEAK GUST 102 MPH SW 1931, 1885 [SYNTHETIC TEST DATA]" +September,9,16,74,1978,45,1905,1.29,1947,None,,77,ENE,FALSE,1914,,HIGH 74 1968 | LOW 45 2006 | PRECIP 1.29 2002 | SNOW None | PEAK GUST 77 MPH ENE 1914 [SYNTHETIC TEST DATA] +September,9,17,91,"1941, 2024",29,1983,1.20,1934,None,,74,NW,FALSE,1941,,"HIGH 91 1899 | LOW 29 1951 | PRECIP 1.20 2008, 1936 | SNOW None | PEAK GUST 74 MPH NW 1941 [SYNTHETIC TEST DATA]" +September,9,18,77,1961,48,2024,1.04,1888,None,,105,SE,FALSE,"1948, 1978",,"HIGH 77 1979 | LOW 48 1897 | PRECIP 1.04 1979 | SNOW None | PEAK GUST 105 MPH SE 1948, 1978 [SYNTHETIC TEST DATA]" +September,9,19,83,"2023, 1978",42,1929,2.25,1953,None,,69,S,FALSE,"2022, 1980",,"HIGH 83 1978 | LOW 42 1979 | PRECIP 2.25 1965 | SNOW None | PEAK GUST 69 MPH S 2022, 1980 [SYNTHETIC TEST DATA]" +September,9,20,77,1918,29,"2006, 1933",4.30,1936,None,,75,WNW,TRUE,1993,,"HIGH 77 1977 | LOW 29 2004, 1977 | PRECIP 4.30 1944 | SNOW None | PEAK GUST 75e MPH WNW 1993 [SYNTHETIC TEST DATA]" +September,9,21,95,1885,51,1968,2.91,1982,None,,67,E,FALSE,"2013, 1894",SYNTHETIC,"HIGH 95 1898 | LOW 51 1947 | PRECIP 2.91 1933 | SNOW None | PEAK GUST 67 MPH E 2013, 1894 [SYNTHETIC TEST DATA]" +September,9,22,93,1896,43,1899,6.40,1972,None,,75,WSW,FALSE,1991,,"HIGH 93 2016 | LOW 43 1991, 2020 | PRECIP 6.40 1889 | SNOW None | PEAK GUST 75 MPH WSW 1991 [SYNTHETIC TEST DATA]" +September,9,23,80,1938,56,1915,1.13,1952,None,,114,SW,TRUE,1998,,"HIGH 80 2019 | LOW 56 1915, 2021 | PRECIP 1.13 1960 | SNOW None | PEAK GUST 114e MPH SW 1998 [SYNTHETIC TEST DATA]" +September,9,24,84,"1911, 1955",42,"1931, 1928",1.22,1964,None,,70,E,FALSE,1943,TEST,HIGH 84 1942 | LOW 42 1918 | PRECIP 1.22 1896 | SNOW None | PEAK GUST 70 MPH E 1943 [SYNTHETIC TEST DATA] +September,9,25,91,"2014, 2021",44,1906,5.08,1910,None,,42,N,FALSE,1889,,"HIGH 91 1892, 2004 | LOW 44 1960 | PRECIP 5.08 1918 | SNOW None | PEAK GUST 42 MPH N 1889 [SYNTHETIC TEST DATA]" +September,9,26,81,1924,43,"1988, 2026",6.02,2001,None,,40,W,TRUE,1951,TEST,HIGH 81 1997 | LOW 43 2015 | PRECIP 6.02 1899 | SNOW None | PEAK GUST 40e MPH W 1951 [SYNTHETIC TEST DATA] +September,9,27,85,1946,40,1922,6.14,1936,None,,80,SE,FALSE,"1899, 1888",SYNTHETIC,"HIGH 85 1896, 1889 | LOW 40 1896 | PRECIP 6.14 1917 | SNOW None | PEAK GUST 80 MPH SE 1899, 1888 [SYNTHETIC TEST DATA]" +September,9,28,94,1919,59,1898,1.18,2020,None,,83,SE,TRUE,2012,,HIGH 94 1974 | LOW 59 1930 | PRECIP 1.18 1948 | SNOW None | PEAK GUST 83e MPH SE 2012 [SYNTHETIC TEST DATA] +September,9,29,78,1886,41,"1899, 1990",1.69,1927,None,,62,ENE,FALSE,2011,SYNTHETIC,HIGH 78 1896 | LOW 41 1979 | PRECIP 1.69 2009 | SNOW None | PEAK GUST 62 MPH ENE 2011 [SYNTHETIC TEST DATA] +September,9,30,74,1991,55,1966,2.68,2009,None,,36,SE,FALSE,1951,SYNTHETIC,"HIGH 74 1944 | LOW 55 1966, 1994 | PRECIP 2.68 1888 | SNOW None | PEAK GUST 36 MPH SE 1951 [SYNTHETIC TEST DATA]" +October,10,1,79,1982,29,1976,3.30,2005,None,,105,NNW,FALSE,1978,,"HIGH 79 1977 | LOW 29 1939 | PRECIP 3.30 1998, 1901 | SNOW None | PEAK GUST 105 MPH NNW 1978 [SYNTHETIC TEST DATA]" +October,10,2,86,1903,23,1933,2.32,1899,None,,40,SSW,TRUE,1928,,HIGH 86 1964 | LOW 23 1919 | PRECIP 2.32 1987 | SNOW None | PEAK GUST 40e MPH SSW 1928 [SYNTHETIC TEST DATA] +October,10,3,68,"1913, 1995",19,1960,1.21,1995,None,,42,N,FALSE,1912,,"HIGH 68 1968, 1901 | LOW 19 1988 | PRECIP 1.21 2007, 1941 | SNOW None | PEAK GUST 42 MPH N 1912 [SYNTHETIC TEST DATA]" +October,10,4,86,1902,38,"1919, 1934",0.49,1974,26.6,2017,41,SE,TRUE,1958,TEST,"HIGH 86 1962 | LOW 38 1959 | PRECIP 0.49 1900, 2018 | SNOW 26.6 2017 | PEAK GUST 41e MPH SE 1958 [SYNTHETIC TEST DATA]" +October,10,5,85,2002,22,2015,1.31,1925,None,,38,S,FALSE,1985,SYNTHETIC,"HIGH 85 1932, 1920 | LOW 22 1978 | PRECIP 1.31 1991 | SNOW None | PEAK GUST 38 MPH S 1985 [SYNTHETIC TEST DATA]" +October,10,6,79,1985,45,1927,1.10,1980,18.2,1960,50,SE,FALSE,1897,TEST,"HIGH 79 2010 | LOW 45 2026 | PRECIP 1.10 1974, 1896 | SNOW 18.2 1960 | PEAK GUST 50 MPH SE 1897 [SYNTHETIC TEST DATA]" +October,10,7,82,1960,28,2004,0.63,1924,None,,70,WSW,TRUE,2012,,"HIGH 82 1953 | LOW 28 2004, 1997 | PRECIP 0.63 1913 | SNOW None | PEAK GUST 70e MPH WSW 2012 [SYNTHETIC TEST DATA]" +October,10,8,85,2001,29,1915,4.82,1909,None,,114,E,FALSE,1928,,HIGH 85 1968 | LOW 29 2003 | PRECIP 4.82 1901 | SNOW None | PEAK GUST 114 MPH E 1928 [SYNTHETIC TEST DATA] +October,10,9,82,1934,45,2002,5.01,1958,None,,90,NNE,FALSE,1917,SYNTHETIC,"HIGH 82 1958 | LOW 45 1892 | PRECIP 5.01 1908, 1974 | SNOW None | PEAK GUST 90 MPH NNE 1917 [SYNTHETIC TEST DATA]" +October,10,10,88,"1888, 2016",44,1912,0.84,1906,None,,74,WSW,FALSE,1898,,HIGH 88 1921 | LOW 44 1901 | PRECIP 0.84 1888 | SNOW None | PEAK GUST 74 MPH WSW 1898 [SYNTHETIC TEST DATA] +October,10,11,74,1944,35,1955,3.04,1926,16.9,1912,55,S,FALSE,1921,,"HIGH 74 1954, 1978 | LOW 35 1942 | PRECIP 3.04 1976 | SNOW 16.9 1912 | PEAK GUST 55 MPH S 1921 [SYNTHETIC TEST DATA]" +October,10,12,87,1922,37,1913,1.61,1996,None,,92,NNW,FALSE,2006,,"HIGH 87 1934, 1932 | LOW 37 1915 | PRECIP 1.61 1963, 1885 | SNOW None | PEAK GUST 92 MPH NNW 2006 [SYNTHETIC TEST DATA]" +October,10,13,87,1953,18,1947,5.70,1981,2.4,1958,108,WSW,FALSE,1950,,HIGH 87 2016 | LOW 18 1957 | PRECIP 5.70 1946 | SNOW 2.4 1958 | PEAK GUST 108 MPH WSW 1950 [SYNTHETIC TEST DATA] +October,10,14,66,1928,35,1994,3.54,2016,None,,76,SSE,FALSE,"1969, 1934",SYNTHETIC,"HIGH 66 1903 | LOW 35 1984 | PRECIP 3.54 1928 | SNOW None | PEAK GUST 76 MPH SSE 1969, 1934 [SYNTHETIC TEST DATA]" +October,10,15,73,2002,35,1938,5.95,1977,16.9,"1995, 1989",97,SE,FALSE,2022,,"HIGH 73 1919 | LOW 35 2020 | PRECIP 5.95 1997 | SNOW 16.9 1995, 1989 | PEAK GUST 97 MPH SE 2022 [SYNTHETIC TEST DATA]" +October,10,16,83,"2025, 2018",29,"1957, 1921",4.33,1928,None,,84,SSW,FALSE,1971,,"HIGH 83 1959 | LOW 29 1915, 1944 | PRECIP 4.33 1916 | SNOW None | PEAK GUST 84 MPH SSW 1971 [SYNTHETIC TEST DATA]" +October,10,17,74,1943,19,1955,1.48,1916,None,,88,SSE,TRUE,1963,,HIGH 74 1922 | LOW 19 1986 | PRECIP 1.48 1965 | SNOW None | PEAK GUST 88e MPH SSE 1963 [SYNTHETIC TEST DATA] +October,10,18,66,2008,21,2014,4.18,1935,None,,47,ESE,FALSE,2019,SYNTHETIC,HIGH 66 1890 | LOW 21 1988 | PRECIP 4.18 1955 | SNOW None | PEAK GUST 47 MPH ESE 2019 [SYNTHETIC TEST DATA] +October,10,19,69,1987,41,1941,2.52,"1944, 2012",None,,114,WSW,TRUE,1992,,HIGH 69 2009 | LOW 41 1995 | PRECIP 2.52 1990 | SNOW None | PEAK GUST 114e MPH WSW 1992 [SYNTHETIC TEST DATA] +October,10,20,70,1897,35,1993,4.26,2011,23.3,1888,42,ESE,FALSE,1953,SYNTHETIC,"HIGH 70 1987, 1980 | LOW 35 1968, 1973 | PRECIP 4.26 1957 | SNOW 23.3 1888 | PEAK GUST 42 MPH ESE 1953 [SYNTHETIC TEST DATA]" +October,10,21,83,2022,48,1974,4.47,"1974, 1885",None,,96,N,FALSE,1902,,HIGH 83 1942 | LOW 48 1995 | PRECIP 4.47 1988 | SNOW None | PEAK GUST 96 MPH N 1902 [SYNTHETIC TEST DATA] +October,10,22,70,1956,42,1988,1.31,2024,None,,68,WSW,FALSE,2016,SYNTHETIC,HIGH 70 1908 | LOW 42 1918 | PRECIP 1.31 1904 | SNOW None | PEAK GUST 68 MPH WSW 2016 [SYNTHETIC TEST DATA] +October,10,23,72,1992,28,"2019, 2008",0.90,2012,None,,77,N,TRUE,2007,,"HIGH 72 1917 | LOW 28 2005, 1921 | PRECIP 0.90 1943 | SNOW None | PEAK GUST 77e MPH N 2007 [SYNTHETIC TEST DATA]" +October,10,24,82,1893,45,1954,5.86,1975,None,,59,ENE,FALSE,1892,SYNTHETIC,"HIGH 82 2017 | LOW 45 1885, 1918 | PRECIP 5.86 1885 | SNOW None | PEAK GUST 59 MPH ENE 1892 [SYNTHETIC TEST DATA]" +October,10,25,78,1969,40,"1925, 1902",4.68,1933,None,,50,SSE,FALSE,1885,TEST,HIGH 78 2026 | LOW 40 1967 | PRECIP 4.68 1926 | SNOW None | PEAK GUST 50 MPH SSE 1885 [SYNTHETIC TEST DATA] +October,10,26,68,1907,41,1973,0.68,"1949, 1952",None,,94,W,FALSE,"1896, 1974",,"HIGH 68 2009 | LOW 41 1967 | PRECIP 0.68 1924 | SNOW None | PEAK GUST 94 MPH W 1896, 1974 [SYNTHETIC TEST DATA]" +October,10,27,86,2015,45,1994,2.09,"1907, 1973",None,,41,NNW,FALSE,1996,SYNTHETIC,HIGH 86 1929 | LOW 45 1900 | PRECIP 2.09 1926 | SNOW None | PEAK GUST 41 MPH NNW 1996 [SYNTHETIC TEST DATA] +October,10,28,66,2001,44,1972,5.59,1988,None,,107,SW,FALSE,1894,,"HIGH 66 2009, 2023 | LOW 44 1913, 1975 | PRECIP 5.59 1974 | SNOW None | PEAK GUST 107 MPH SW 1894 [SYNTHETIC TEST DATA]" +October,10,29,83,"1986, 1931",25,2018,5.27,1923,None,,49,ENE,FALSE,1945,,"HIGH 83 1915, 1974 | LOW 25 1911 | PRECIP 5.27 1905 | SNOW None | PEAK GUST 49 MPH ENE 1945 [SYNTHETIC TEST DATA]" +October,10,30,66,1895,29,1919,0.42,1919,None,,85,SSE,TRUE,1902,,"HIGH 66 1927 | LOW 29 1895, 1983 | PRECIP 0.42 1995 | SNOW None | PEAK GUST 85e MPH SSE 1902 [SYNTHETIC TEST DATA]" +October,10,31,73,1950,23,"1941, 1922",3.60,1941,None,,62,NNE,FALSE,1960,,HIGH 73 1960 | LOW 23 1934 | PRECIP 3.60 1902 | SNOW None | PEAK GUST 62 MPH NNE 1960 [SYNTHETIC TEST DATA] +November,11,1,67,1930,16,1964,4.12,2018,26.5,1965,115,SW,FALSE,"1904, 1899",TEST,"HIGH 67 1919 | LOW 16 2022 | PRECIP 4.12 1983, 1909 | SNOW 26.5 1965 | PEAK GUST 115 MPH SW 1904, 1899 [SYNTHETIC TEST DATA]" +November,11,2,68,"2003, 1910",5,2023,0.47,1978,16.4,1952,107,ESE,FALSE,2007,,HIGH 68 1932 | LOW 5 1948 | PRECIP 0.47 1925 | SNOW 16.4 1952 | PEAK GUST 107 MPH ESE 2007 [SYNTHETIC TEST DATA] +November,11,3,63,1906,29,2018,5.18,"1894, 1910",1.4,1994,47,N,FALSE,"2022, 1942",TEST,"HIGH 63 1962 | LOW 29 2018 | PRECIP 5.18 1945 | SNOW 1.4 1994 | PEAK GUST 47 MPH N 2022, 1942 [SYNTHETIC TEST DATA]" +November,11,4,71,1944,23,1990,6.05,"1955, 1888",25.9,1958,102,E,FALSE,1906,,HIGH 71 1895 | LOW 23 1971 | PRECIP 6.05 1898 | SNOW 25.9 1958 | PEAK GUST 102 MPH E 1906 [SYNTHETIC TEST DATA] +November,11,5,63,1963,17,2008,4.24,"1939, 2017",23.4,1981,115,ESE,FALSE,1896,,HIGH 63 1961 | LOW 17 2002 | PRECIP 4.24 1904 | SNOW 23.4 1981 | PEAK GUST 115 MPH ESE 1896 [SYNTHETIC TEST DATA] +November,11,6,66,1910,24,1920,0.78,1958,26.3,2001,85,N,FALSE,1973,,HIGH 66 1975 | LOW 24 2002 | PRECIP 0.78 1931 | SNOW 26.3 2001 | PEAK GUST 85 MPH N 1973 [SYNTHETIC TEST DATA] +November,11,7,76,1996,22,2004,0.38,1920,18.6,1996,75,WNW,FALSE,1920,,"HIGH 76 1923 | LOW 22 2020 | PRECIP 0.38 1897, 1949 | SNOW 18.6 1996 | PEAK GUST 75 MPH WNW 1920 [SYNTHETIC TEST DATA]" +November,11,8,72,1981,32,1996,2.09,2001,13.4,"2026, 1975",87,ESE,FALSE,1974,,"HIGH 72 1988, 1902 | LOW 32 1979 | PRECIP 2.09 1958 | SNOW 13.4 2026, 1975 | PEAK GUST 87 MPH ESE 1974 [SYNTHETIC TEST DATA]" +November,11,9,67,1993,5,2002,6.44,2024,18.2,2024,56,W,FALSE,1932,,HIGH 67 1926 | LOW 5 1919 | PRECIP 6.44 2003 | SNOW 18.2 2024 | PEAK GUST 56 MPH W 1932 [SYNTHETIC TEST DATA] +November,11,10,71,"1895, 1961",30,1987,5.21,"1988, 1987",26,"2026, 1948",85,SE,FALSE,1946,,"HIGH 71 1936 | LOW 30 1894 | PRECIP 5.21 1961 | SNOW 26.0 2026, 1948 | PEAK GUST 85 MPH SE 1946 [SYNTHETIC TEST DATA]" +November,11,11,74,2016,17,1959,0.45,1891,26,"1935, 1963",71,SSW,FALSE,1905,,"HIGH 74 1934 | LOW 17 2000 | PRECIP 0.45 1925, 2020 | SNOW 26.0 1935, 1963 | PEAK GUST 71 MPH SSW 1905 [SYNTHETIC TEST DATA]" +November,11,12,57,"1977, 1976",18,1970,3.74,1971,17.2,"1958, 1904",54,S,FALSE,1906,SYNTHETIC,"HIGH 57 2019 | LOW 18 1972 | PRECIP 3.74 1967 | SNOW 17.2 1958, 1904 | PEAK GUST 54 MPH S 1906 [SYNTHETIC TEST DATA]" +November,11,13,78,2003,36,1921,1.25,1972,27.6,1918,95,ESE,FALSE,1964,TEST,"HIGH 78 2011, 2013 | LOW 36 1931 | PRECIP 1.25 1954 | SNOW 27.6 1918 | PEAK GUST 95 MPH ESE 1964 [SYNTHETIC TEST DATA]" +November,11,14,71,2019,23,1928,4.48,1936,19.9,1933,90,WNW,FALSE,1962,,"HIGH 71 2006 | LOW 23 1949, 1995 | PRECIP 4.48 1885, 1959 | SNOW 19.9 1933 | PEAK GUST 90 MPH WNW 1962 [SYNTHETIC TEST DATA]" +November,11,15,64,1933,8,1944,1.43,1948,9.1,2016,54,E,FALSE,1890,TEST,"HIGH 64 2000 | LOW 8 1896 | PRECIP 1.43 1948, 1935 | SNOW 9.1 2016 | PEAK GUST 54 MPH E 1890 [SYNTHETIC TEST DATA]" +November,11,16,69,1945,26,"1933, 1971",3.24,2019,2.8,1971,78,S,FALSE,1920,,HIGH 69 1994 | LOW 26 2009 | PRECIP 3.24 2017 | SNOW 2.8 1971 | PEAK GUST 78 MPH S 1920 [SYNTHETIC TEST DATA] +November,11,17,62,1928,4,2016,2.44,1900,27.6,1983,50,NW,TRUE,1919,,"HIGH 62 2013, 1887 | LOW 4 1972 | PRECIP 2.44 1979 | SNOW 27.6 1983 | PEAK GUST 50e MPH NW 1919 [SYNTHETIC TEST DATA]" +November,11,18,58,1957,18,2006,3.52,2025,16.6,1949,54,E,FALSE,2026,,"HIGH 58 1981 | LOW 18 2017 | PRECIP 3.52 1990, 1930 | SNOW 16.6 1949 | PEAK GUST 54 MPH E 2026 [SYNTHETIC TEST DATA]" +November,11,19,59,"1916, 1901",22,2005,1.16,2000,10.1,1994,52,W,FALSE,"1892, 1962",,"HIGH 59 2002 | LOW 22 1900 | PRECIP 1.16 1933 | SNOW 10.1 1994 | PEAK GUST 52 MPH W 1892, 1962 [SYNTHETIC TEST DATA]" +November,11,20,78,1897,24,1997,4.46,"2000, 1932",23.5,"1995, 1974",102,WSW,FALSE,1916,,"HIGH 78 1993 | LOW 24 1926 | PRECIP 4.46 2012 | SNOW 23.5 1995, 1974 | PEAK GUST 102 MPH WSW 1916 [SYNTHETIC TEST DATA]" +November,11,21,66,2019,29,1896,3.22,1900,13.5,2002,59,NNW,FALSE,1934,,HIGH 66 1950 | LOW 29 1959 | PRECIP 3.22 1966 | SNOW 13.5 2002 | PEAK GUST 59 MPH NNW 1934 [SYNTHETIC TEST DATA] +November,11,22,75,1890,18,1970,4.05,1894,27.5,1916,43,WSW,FALSE,1966,,HIGH 75 2025 | LOW 18 1957 | PRECIP 4.05 1948 | SNOW 27.5 1916 | PEAK GUST 43 MPH WSW 1966 [SYNTHETIC TEST DATA] +November,11,23,56,1967,9,2003,0.41,"1941, 2026",7,2020,96,NE,TRUE,1987,SYNTHETIC,"HIGH 56 2020 | LOW 9 1885 | PRECIP 0.41 1924, 2019 | SNOW 7.0 2020 | PEAK GUST 96e MPH NE 1987 [SYNTHETIC TEST DATA]" +November,11,24,55,1929,5,"1998, 1917",2.45,1922,14.7,2025,57,WNW,FALSE,"1977, 1920",SYNTHETIC,"HIGH 55 1976, 2010 | LOW 5 2001 | PRECIP 2.45 1944 | SNOW 14.7 2025 | PEAK GUST 57 MPH WNW 1977, 1920 [SYNTHETIC TEST DATA]" +November,11,25,72,1909,9,1974,6.48,2024,15.9,1950,81,ESE,FALSE,"1997, 1947",TEST,"HIGH 72 1952 | LOW 9 2003 | PRECIP 6.48 1902 | SNOW 15.9 1950 | PEAK GUST 81 MPH ESE 1997, 1947 [SYNTHETIC TEST DATA]" +November,11,26,61,1911,34,2010,2.85,1940,5.9,1943,58,NNW,TRUE,1978,,HIGH 61 1904 | LOW 34 1932 | PRECIP 2.85 2025 | SNOW 5.9 1943 | PEAK GUST 58e MPH NNW 1978 [SYNTHETIC TEST DATA] +November,11,27,69,1988,32,1974,4.82,1951,4.9,1929,99,WNW,TRUE,1958,,"HIGH 69 1890 | LOW 32 1898 | PRECIP 4.82 1994, 1986 | SNOW 4.9 1929 | PEAK GUST 99e MPH WNW 1958 [SYNTHETIC TEST DATA]" +November,11,28,73,1911,28,1885,4.77,2007,0.5,"1916, 2012",53,ENE,FALSE,1962,,"HIGH 73 2006 | LOW 28 1946 | PRECIP 4.77 1911 | SNOW 0.5 1916, 2012 | PEAK GUST 53 MPH ENE 1962 [SYNTHETIC TEST DATA]" +November,11,29,62,"2011, 1897",33,1944,6.21,1918,5.3,1936,62,SE,FALSE,1932,TEST,"HIGH 62 1968, 1927 | LOW 33 1942 | PRECIP 6.21 1947 | SNOW 5.3 1936 | PEAK GUST 62 MPH SE 1932 [SYNTHETIC TEST DATA]" +November,11,30,58,1902,19,2010,1.44,1953,25.3,"2020, 1969",89,NNE,FALSE,1983,SYNTHETIC,"HIGH 58 2020 | LOW 19 1907 | PRECIP 1.44 1903 | SNOW 25.3 2020, 1969 | PEAK GUST 89 MPH NNE 1983 [SYNTHETIC TEST DATA]" +December,12,1,46,2023,13,1998,2.00,1890,16.7,1968,83,NE,FALSE,2019,,HIGH 46 1998 | LOW 13 1956 | PRECIP 2.00 1896 | SNOW 16.7 1968 | PEAK GUST 83 MPH NE 2019 [SYNTHETIC TEST DATA] +December,12,2,54,1931,17,1992,6.16,2019,20,1942,67,E,TRUE,1960,,HIGH 54 1982 | LOW 17 1895 | PRECIP 6.16 1962 | SNOW 20.0 1942 | PEAK GUST 67e MPH E 1960 [SYNTHETIC TEST DATA] +December,12,3,63,1988,-15,1890,0.55,1896,19.2,1931,93,SSE,FALSE,1996,SYNTHETIC,HIGH 63 1929 | LOW -15 2020 | PRECIP 0.55 2005 | SNOW 19.2 1931 | PEAK GUST 93 MPH SSE 1996 [SYNTHETIC TEST DATA] +December,12,4,42,2024,-15,1960,4.77,1987,22,1982,109,SW,FALSE,1986,,"HIGH 42 1927, 1912 | LOW -15 2024 | PRECIP 4.77 1969 | SNOW 22.0 1982 | PEAK GUST 109 MPH SW 1986 [SYNTHETIC TEST DATA]" +December,12,5,48,1898,-3,"1903, 1987",0.94,1986,7.6,1950,102,E,TRUE,1894,,HIGH 48 1910 | LOW -3 2019 | PRECIP 0.94 1991 | SNOW 7.6 1950 | PEAK GUST 102e MPH E 1894 [SYNTHETIC TEST DATA] +December,12,6,43,"1974, 1926",-4,2001,2.65,1959,24.7,2001,98,WSW,FALSE,"1998, 1947",,"HIGH 43 1941 | LOW -4 1979 | PRECIP 2.65 2024 | SNOW 24.7 2001 | PEAK GUST 98 MPH WSW 1998, 1947 [SYNTHETIC TEST DATA]" +December,12,7,60,1916,-14,1891,0.45,1981,11.9,1908,41,E,FALSE,2010,,HIGH 60 1970 | LOW -14 2018 | PRECIP 0.45 1930 | SNOW 11.9 1908 | PEAK GUST 41 MPH E 2010 [SYNTHETIC TEST DATA] +December,12,8,64,1912,-1,1999,1.55,1907,6,1885,63,SE,TRUE,1938,SYNTHETIC,"HIGH 64 1975 | LOW -1 1945, 1996 | PRECIP 1.55 1896 | SNOW 6.0 1885 | PEAK GUST 63e MPH SE 1938 [SYNTHETIC TEST DATA]" +December,12,9,52,1980,-12,1922,4.58,1995,14.8,2013,76,NW,FALSE,1999,,"HIGH 52 2017, 1973 | LOW -12 1973 | PRECIP 4.58 1979 | SNOW 14.8 2013 | PEAK GUST 76 MPH NW 1999 [SYNTHETIC TEST DATA]" +December,12,10,61,"1893, 1944",9,1960,5.49,1988,12.2,1924,54,SE,FALSE,1948,,"HIGH 61 1934 | LOW 9 2015 | PRECIP 5.49 1970, 1972 | SNOW 12.2 1924 | PEAK GUST 54 MPH SE 1948 [SYNTHETIC TEST DATA]" +December,12,11,48,1890,0,"1923, 1948",3.72,"1977, 1954",8.6,2002,108,SSW,FALSE,1913,TEST,"HIGH 48 1968, 1948 | LOW 0 1891 | PRECIP 3.72 2022 | SNOW 8.6 2002 | PEAK GUST 108 MPH SSW 1913 [SYNTHETIC TEST DATA]" +December,12,12,59,1901,-7,1895,5.95,1967,4.3,1971,40,SSE,FALSE,1901,,HIGH 59 1992 | LOW -7 1982 | PRECIP 5.95 1935 | SNOW 4.3 1971 | PEAK GUST 40 MPH SSE 1901 [SYNTHETIC TEST DATA] +December,12,13,52,1977,12,1902,2.95,1945,17.2,"1966, 2006",84,WNW,FALSE,1988,SYNTHETIC,"HIGH 52 2005 | LOW 12 1951 | PRECIP 2.95 1991, 1930 | SNOW 17.2 1966, 2006 | PEAK GUST 84 MPH WNW 1988 [SYNTHETIC TEST DATA]" +December,12,14,62,1963,-9,1974,4.64,1955,12.6,1966,62,S,FALSE,1965,,HIGH 62 1977 | LOW -9 1981 | PRECIP 4.64 1929 | SNOW 12.6 1966 | PEAK GUST 62 MPH S 1965 [SYNTHETIC TEST DATA] +December,12,15,49,"1947, 1969",6,1972,4.58,"1999, 1972",22.8,"1895, 1920",38,NNE,FALSE,1908,,"HIGH 49 2012 | LOW 6 1888 | PRECIP 4.58 1998 | SNOW 22.8 1895, 1920 | PEAK GUST 38 MPH NNE 1908 [SYNTHETIC TEST DATA]" +December,12,16,52,1931,5,1941,3.41,1911,14.8,2022,86,W,FALSE,"1904, 1889",,"HIGH 52 1902 | LOW 5 2021 | PRECIP 3.41 1970 | SNOW 14.8 2022 | PEAK GUST 86 MPH W 1904, 1889 [SYNTHETIC TEST DATA]" +December,12,17,57,"1923, 2021",4,1930,3.97,1971,11.7,2002,85,E,TRUE,1963,TEST,HIGH 57 1997 | LOW 4 2023 | PRECIP 3.97 1952 | SNOW 11.7 2002 | PEAK GUST 85e MPH E 1963 [SYNTHETIC TEST DATA] +December,12,18,53,1909,9,1993,5.66,"1995, 1904",13.2,1886,104,WNW,FALSE,2025,SYNTHETIC,"HIGH 53 1972 | LOW 9 1972 | PRECIP 5.66 1984, 1922 | SNOW 13.2 1886 | PEAK GUST 104 MPH WNW 2025 [SYNTHETIC TEST DATA]" +December,12,19,50,1951,11,1972,5.20,1899,1.5,1913,103,SSE,FALSE,2020,SYNTHETIC,HIGH 50 1999 | LOW 11 2006 | PRECIP 5.20 2026 | SNOW 1.5 1913 | PEAK GUST 103 MPH SSE 2020 [SYNTHETIC TEST DATA] +December,12,20,47,2007,-11,1969,2.16,1944,23.2,1910,90,SE,FALSE,1930,,HIGH 47 1979 | LOW -11 2017 | PRECIP 2.16 1894 | SNOW 23.2 1910 | PEAK GUST 90 MPH SE 1930 [SYNTHETIC TEST DATA] +December,12,21,55,1925,-3,1889,4.44,"1996, 1916",10.8,1970,44,SSW,FALSE,1890,,"HIGH 55 1967 | LOW -3 2012 | PRECIP 4.44 1957, 1945 | SNOW 10.8 1970 | PEAK GUST 44 MPH SSW 1890 [SYNTHETIC TEST DATA]" +December,12,22,43,1912,-6,"1930, 1901",5.48,1946,19.9,"1983, 2005",41,SW,FALSE,1890,SYNTHETIC,"HIGH 43 1947 | LOW -6 1889 | PRECIP 5.48 1933 | SNOW 19.9 1983, 2005 | PEAK GUST 41 MPH SW 1890 [SYNTHETIC TEST DATA]" +December,12,23,58,1928,-6,"1989, 1921",2.97,1969,2.5,1891,45,NW,FALSE,"1941, 1911",,"HIGH 58 2022 | LOW -6 1942 | PRECIP 2.97 1915 | SNOW 2.5 1891 | PEAK GUST 45 MPH NW 1941, 1911 [SYNTHETIC TEST DATA]" +December,12,24,61,1917,-15,1917,1.48,1906,26.2,"1933, 2024",111,NNW,TRUE,1914,,"HIGH 61 1908 | LOW -15 1944 | PRECIP 1.48 2018, 2013 | SNOW 26.2 1933, 2024 | PEAK GUST 111e MPH NNW 1914 [SYNTHETIC TEST DATA]" +December,12,25,62,"2017, 2018",13,1934,4.71,1932,22.4,1904,64,SW,FALSE,1923,,HIGH 62 1965 | LOW 13 1890 | PRECIP 4.71 1967 | SNOW 22.4 1904 | PEAK GUST 64 MPH SW 1923 [SYNTHETIC TEST DATA] +December,12,26,44,1889,-14,"1917, 2002",5.10,1907,16.1,"1980, 1999",37,NW,FALSE,1912,,"HIGH 44 1928 | LOW -14 1994, 2005 | PRECIP 5.10 1938 | SNOW 16.1 1980, 1999 | PEAK GUST 37 MPH NW 1912 [SYNTHETIC TEST DATA]" +December,12,27,55,1959,9,"1971, 1902",3.56,1981,19.9,1933,80,E,FALSE,1963,,HIGH 55 1962 | LOW 9 1905 | PRECIP 3.56 1964 | SNOW 19.9 1933 | PEAK GUST 80 MPH E 1963 [SYNTHETIC TEST DATA] +December,12,28,43,1998,12,2014,5.30,"2021, 2022",20.6,1951,40,WNW,FALSE,"1922, 1914",TEST,"HIGH 43 2017 | LOW 12 2015 | PRECIP 5.30 1966, 1952 | SNOW 20.6 1951 | PEAK GUST 40 MPH WNW 1922, 1914 [SYNTHETIC TEST DATA]" +December,12,29,46,"1955, 1977",-2,1902,5.87,"1947, 2021",14.4,1931,80,SSE,FALSE,1965,,"HIGH 46 1962 | LOW -2 1932 | PRECIP 5.87 1928, 1985 | SNOW 14.4 1931 | PEAK GUST 80 MPH SSE 1965 [SYNTHETIC TEST DATA]" +December,12,30,51,1973,-14,1975,4.54,"1894, 2007",3.2,1930,73,N,FALSE,1930,,HIGH 51 1921 | LOW -14 1931 | PRECIP 4.54 1909 | SNOW 3.2 1930 | PEAK GUST 73 MPH N 1930 [SYNTHETIC TEST DATA] +December,12,31,64,1914,-10,1933,0.99,1921,10.4,1990,98,NNE,FALSE,1962,,HIGH 64 1969 | LOW -10 1969 | PRECIP 0.99 2021 | SNOW 10.4 1990 | PEAK GUST 98 MPH NNE 1962 [SYNTHETIC TEST DATA] \ No newline at end of file diff --git a/apps/backend/upload-lambda/src/parsers/csv.spec.ts b/apps/backend/upload-lambda/src/parsers/csv.spec.ts new file mode 100644 index 000000000..636f246fe --- /dev/null +++ b/apps/backend/upload-lambda/src/parsers/csv.spec.ts @@ -0,0 +1,23 @@ +import { readCsv } from './csv'; + +describe('readCsv', () => { + it('splits rows and fields', () => { + expect(readCsv('a,b\n1,2')).toEqual([ + ['a', 'b'], + ['1', '2'], + ]); + }); + + it('keeps commas, newlines, and escaped quotes inside quoted fields', () => { + expect(readCsv('"2014, 1977","line\nbreak","say ""hi"""')).toEqual([ + ['2014, 1977', 'line\nbreak', 'say "hi"'], + ]); + }); + + it('handles CRLF, a byte order mark, and a trailing newline', () => { + expect(readCsv('a,b\r\n1,\r\n')).toEqual([ + ['a', 'b'], + ['1', ''], + ]); + }); +}); diff --git a/apps/backend/upload-lambda/src/parsers/csv.ts b/apps/backend/upload-lambda/src/parsers/csv.ts new file mode 100644 index 000000000..b50a1e2e5 --- /dev/null +++ b/apps/backend/upload-lambda/src/parsers/csv.ts @@ -0,0 +1,29 @@ +// RFC 4180: fields may be quoted, and a quoted field can hold commas, newlines, +// and "" for a literal quote. Year lists like "2014, 1977" depend on this. +export function readCsv(text: string): string[][] { + const rows: string[][] = []; + let row: string[] = []; + let field = ''; + let quoted = false; + + for (let i = text.charCodeAt(0) === 0xfeff ? 1 : 0; i < text.length; i++) { + const c = text[i]; + if (quoted) { + if (c !== '"') field += c; + else if (text[i + 1] === '"') field += text[i++]; + else quoted = false; + } else if (c === '"') quoted = true; + else if (c === ',') { + row.push(field); + field = ''; + } else if (c === '\n' || c === '\r') { + if (c === '\r' && text[i + 1] === '\n') i++; + row.push(field); + rows.push(row); + row = []; + field = ''; + } else field += c; + } + if (field !== '' || row.length > 0) rows.push([...row, field]); + return rows; +} diff --git a/apps/backend/upload-lambda/src/parsers/historical.spec.ts b/apps/backend/upload-lambda/src/parsers/historical.spec.ts new file mode 100644 index 000000000..8a09bee99 --- /dev/null +++ b/apps/backend/upload-lambda/src/parsers/historical.spec.ts @@ -0,0 +1,209 @@ +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { parseHistorical } from './historical'; + +// January 1 from the fixture, keyed by sheet header. +const BASE: Record = { + Month: 'January', + 'Month #': '1', + Day: '1', + 'High °F': '50', + 'High Year(s)': '1930', + 'Low °F': '-18', + 'Low Year(s)': '2014, 1977', + 'Precip in': '6.14', + 'Precip Year(s)': '1907', + 'Snow in': '18.5', + 'Snow Year(s)': '2019', + 'Peak Gust mph': '111', + 'Wind Dir': 'NW', + 'Estimated?': 'TRUE', + 'Gust Year(s)': '2013', + Notes: 'SYNTHETIC', + 'Source text': 'HIGH 50 1900 | LOW -18 1963', +}; + +// Header on row 1, so the first data row is row 2. +function sheet(...rows: Record[]): string { + const header = Object.keys(BASE); + const quote = (v: string) => + /[",\n]/.test(v) ? `"${v.replace(/"/g, '""')}"` : v; + return [header, ...rows.map((r) => header.map((h) => ({ ...BASE, ...r }[h])))] + .map((cells) => cells.map(quote).join(',')) + .join('\n'); +} + +function errorsOf(csv: string) { + const result = parseHistorical(csv); + if (result.ok === true) throw new Error('expected parsing to fail'); + return result.errors; +} + +describe('parseHistorical', () => { + describe('the All Daily Records fixture', () => { + const result = parseHistorical( + readFileSync(join(__dirname, '__fixtures__/historical.csv'), 'utf8'), + ); + const rows = result.ok ? result.rows : []; + + it('returns one record per calendar day, Feb 29 included', () => { + expect(result).toMatchObject({ ok: true }); + expect(rows).toHaveLength(366); + expect(rows.some((r) => r.month === 2 && r.day === 29)).toBe(true); + }); + + it('reads every column of a row', () => { + expect(rows[0]).toEqual({ + month: 1, + day: 1, + highF: 50, + highYears: [1930], + lowF: -18, + lowYears: [2014, 1977], + precipIn: '6.14', + precipYears: [1907], + snowIn: '18.5', + snowYears: [2019], + peakGustMph: 111, + peakGustDir: 'NW', + peakGustIsEstimated: true, + peakGustYears: [2013], + notes: 'SYNTHETIC', + }); + }); + + it('stores snow "None" as null value and years', () => { + const july4 = rows.find((r) => r.month === 7 && r.day === 4); + expect(july4).toMatchObject({ snowIn: null, snowYears: null }); + expect(rows.filter((r) => r.snowIn === null)).toHaveLength(176); + }); + + it('keeps decimals as written', () => { + const dec28 = rows.find((r) => r.month === 12 && r.day === 28); + expect(dec28?.precipIn).toBe('5.30'); + }); + + it('reads blank notes as null', () => { + expect(rows[1].notes).toBeNull(); + }); + }); + + it('parses a header that is not on the first row', () => { + const result = parseHistorical(`https://example.com,,\n,,\n${sheet(BASE)}`); + expect(result.ok && result.rows).toHaveLength(1); + }); + + it('skips blank rows', () => { + const result = parseHistorical(`${sheet(BASE)}\n,,,,\n\n`); + expect(result.ok && result.rows).toHaveLength(1); + }); + + it('treats blank or "None" values with blank years as no record', () => { + const result = parseHistorical( + sheet({ + 'High °F': '', + 'High Year(s)': '', + 'Peak Gust mph': 'none', + 'Gust Year(s)': '', + 'Wind Dir': '', + 'Estimated?': '', + }), + ); + expect(result.ok && result.rows[0]).toMatchObject({ + highF: null, + highYears: null, + peakGustMph: null, + peakGustYears: null, + peakGustDir: null, + peakGustIsEstimated: false, + }); + }); + + it('rejects years without a value, and a value without years', () => { + expect(errorsOf(sheet({ 'Snow in': 'None', 'Low Year(s)': '' }))).toEqual([ + { row: 2, column: 'Low Year(s)', reason: 'Missing years for Low °F -18' }, + { row: 2, column: 'Snow Year(s)', reason: 'Years given but no Snow in' }, + ]); + }); + + it('rejects values that are not numbers or years', () => { + expect( + errorsOf( + sheet({ + 'High °F': '50.5', + 'Precip in': 'T', + 'Gust Year(s)': '2013, 13', + }), + ), + ).toEqual([ + { + row: 2, + column: 'High °F', + reason: 'Expected a whole number, got "50.5"', + }, + { row: 2, column: 'Precip in', reason: 'Expected a number, got "T"' }, + { row: 2, column: 'Gust Year(s)', reason: 'Not a year: "13"' }, + ]); + }); + + it('rejects an unknown wind direction or estimated flag', () => { + expect( + errorsOf(sheet({ 'Wind Dir': 'NNNW', 'Estimated?': 'yes' })), + ).toEqual([ + { + row: 2, + column: 'Wind Dir', + reason: 'Not a compass direction: "NNNW"', + }, + { + row: 2, + column: 'Estimated?', + reason: 'Expected TRUE or FALSE, got "YES"', + }, + ]); + }); + + it('rejects days that are not on the calendar', () => { + expect( + errorsOf( + sheet( + { Month: 'February', 'Month #': '2', Day: '30' }, + { Month: '', 'Month #': '13', Day: '1' }, + ), + ), + ).toEqual([ + { row: 2, column: 'Day', reason: 'February has no day 30' }, + { row: 3, column: 'Month #', reason: 'No month 13' }, + ]); + }); + + it('rejects a month name that disagrees with Month #', () => { + expect(errorsOf(sheet({ Month: 'March' }))).toEqual([ + { + row: 2, + column: 'Month', + reason: '"March" does not match Month # 1', + }, + ]); + }); + + it('rejects the same day twice', () => { + expect(errorsOf(sheet(BASE, { Day: '2' }, BASE))).toEqual([ + { row: 4, column: 'Day', reason: 'January 1 is also on row 2' }, + ]); + }); + + it('rejects a sheet missing a column', () => { + const csv = sheet(BASE).replace('Gust Year(s)', 'Gust Years'); + expect(errorsOf(csv)).toEqual([ + { row: 1, column: 'Gust Year(s)', reason: 'Missing column' }, + ]); + }); + + it('rejects a file with no header row or no data', () => { + expect(errorsOf('a,b\n1,2')).toEqual([ + { reason: 'No header row with "Month #" and "Day"' }, + ]); + expect(errorsOf(sheet())).toEqual([{ reason: 'No data rows' }]); + }); +}); diff --git a/apps/backend/upload-lambda/src/parsers/historical.ts b/apps/backend/upload-lambda/src/parsers/historical.ts new file mode 100644 index 000000000..29a6fd252 --- /dev/null +++ b/apps/backend/upload-lambda/src/parsers/historical.ts @@ -0,0 +1,228 @@ +import type { + HistoricalRecord, + ParseResult, + RowError, +} from '@bho/weather-parsing'; +import { readCsv } from './csv'; + +// Sheet headers, from the "All Daily Records" tab. "Month" and "Source text" +// are not stored: Month # carries the month, and Source text is a free-text +// rendering of the other columns. +const COLUMNS = { + monthNum: 'Month #', + day: 'Day', + highF: 'High °F', + highYears: 'High Year(s)', + lowF: 'Low °F', + lowYears: 'Low Year(s)', + precipIn: 'Precip in', + precipYears: 'Precip Year(s)', + snowIn: 'Snow in', + snowYears: 'Snow Year(s)', + peakGustMph: 'Peak Gust mph', + peakGustDir: 'Wind Dir', + peakGustIsEstimated: 'Estimated?', + peakGustYears: 'Gust Year(s)', + notes: 'Notes', +}; +const MONTH_NAME = 'Month'; + +const MONTHS = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', +]; +// Records cover every calendar day, so February has 29. +const DAYS_IN_MONTH = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +const COMPASS = new Set( + 'N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW'.split(' '), +); + +const INTEGER = /^-?\d+$/; +const DECIMAL = /^\d+(\.\d+)?$/; +const YEAR = /^\d{4}$/; + +// Returns every problem in the file rather than stopping at the first, so one +// upload attempt shows staff everything to fix. +export function parseHistorical(csv: string): ParseResult { + const table = readCsv(csv); + const headerIndex = table.findIndex( + (cells) => + cells.some((c) => c.trim() === COLUMNS.monthNum) && + cells.some((c) => c.trim() === COLUMNS.day), + ); + if (headerIndex === -1) { + return { + ok: false, + errors: [ + { + reason: `No header row with "${COLUMNS.monthNum}" and "${COLUMNS.day}"`, + }, + ], + }; + } + + const header = table[headerIndex].map((c) => c.trim()); + const missing = Object.values(COLUMNS).filter((c) => !header.includes(c)); + if (missing.length > 0) { + return { + ok: false, + errors: missing.map((column) => ({ + row: headerIndex + 1, + column, + reason: 'Missing column', + })), + }; + } + + const errors: RowError[] = []; + const rows: HistoricalRecord[] = []; + const seen = new Map(); + + for (let i = headerIndex + 1; i < table.length; i++) { + const cells = table[i]; + if (cells.every((c) => c.trim() === '')) continue; + + const row = i + 1; + const get = (column: string) => + (cells[header.indexOf(column)] ?? '').trim(); + const fail = (column: string, reason: string) => + errors.push({ row, column, reason }); + + const integer = (column: string): number | null => { + const value = get(column); + if (INTEGER.test(value)) return Number(value); + fail(column, `Expected a whole number, got "${value}"`); + return null; + }; + + // A record value and its years go together. Blank or "None" means no + // record, and then the years must be blank too. + const element = ( + column: string, + yearsColumn: string, + parse: (column: string) => T | null, + ): [T | null, number[] | null] => { + const value = get(column); + const years = get(yearsColumn); + if (value === '' || value.toLowerCase() === 'none') { + if (years !== '') fail(yearsColumn, `Years given but no ${column}`); + return [null, null]; + } + if (years === '') { + fail(yearsColumn, `Missing years for ${column} ${value}`); + return [parse(column), null]; + } + const list = years.split(',').map((y) => y.trim()); + const bad = list.filter((y) => !YEAR.test(y)); + if (bad.length > 0) + fail(yearsColumn, `Not a year: "${bad.join('", "')}"`); + return [parse(column), list.map(Number)]; + }; + const decimal = (column: string): string | null => { + const value = get(column); + if (DECIMAL.test(value)) return value; + fail(column, `Expected a number, got "${value}"`); + return null; + }; + + const month = integer(COLUMNS.monthNum); + const day = integer(COLUMNS.day); + if (month !== null && (month < 1 || month > 12)) { + fail(COLUMNS.monthNum, `No month ${month}`); + } else if (month !== null && day !== null) { + if (day < 1 || day > DAYS_IN_MONTH[month - 1]) { + fail(COLUMNS.day, `${MONTHS[month - 1]} has no day ${day}`); + } + const name = get(MONTH_NAME); + if ( + name !== '' && + name.toLowerCase() !== MONTHS[month - 1].toLowerCase() + ) { + fail( + MONTH_NAME, + `"${name}" does not match ${COLUMNS.monthNum} ${month}`, + ); + } + const key = `${month}-${day}`; + const first = seen.get(key); + if (first !== undefined) { + fail( + COLUMNS.day, + `${MONTHS[month - 1]} ${day} is also on row ${first}`, + ); + } else { + seen.set(key, row); + } + } + + const [highF, highYears] = element( + COLUMNS.highF, + COLUMNS.highYears, + integer, + ); + const [lowF, lowYears] = element(COLUMNS.lowF, COLUMNS.lowYears, integer); + const [precipIn, precipYears] = element( + COLUMNS.precipIn, + COLUMNS.precipYears, + decimal, + ); + const [snowIn, snowYears] = element( + COLUMNS.snowIn, + COLUMNS.snowYears, + decimal, + ); + const [peakGustMph, peakGustYears] = element( + COLUMNS.peakGustMph, + COLUMNS.peakGustYears, + integer, + ); + + const dir = get(COLUMNS.peakGustDir).toUpperCase(); + if (dir !== '' && !COMPASS.has(dir)) { + fail(COLUMNS.peakGustDir, `Not a compass direction: "${dir}"`); + } + + const estimated = get(COLUMNS.peakGustIsEstimated).toUpperCase(); + if (estimated !== '' && estimated !== 'TRUE' && estimated !== 'FALSE') { + fail( + COLUMNS.peakGustIsEstimated, + `Expected TRUE or FALSE, got "${estimated}"`, + ); + } + + if (month === null || day === null) continue; + rows.push({ + month, + day, + highF, + highYears, + lowF, + lowYears, + precipIn, + precipYears, + snowIn, + snowYears, + peakGustMph, + peakGustDir: dir || null, + peakGustIsEstimated: estimated === 'TRUE', + peakGustYears, + notes: get(COLUMNS.notes) || null, + }); + } + + if (errors.length > 0) return { ok: false, errors }; + if (rows.length === 0) { + return { ok: false, errors: [{ reason: 'No data rows' }] }; + } + return { ok: true, rows }; +} diff --git a/libs/weather-parsing/src/index.ts b/libs/weather-parsing/src/index.ts new file mode 100644 index 000000000..fcb073fef --- /dev/null +++ b/libs/weather-parsing/src/index.ts @@ -0,0 +1 @@ +export * from './types'; diff --git a/libs/weather-parsing/src/types.ts b/libs/weather-parsing/src/types.ts new file mode 100644 index 000000000..a6d485b98 --- /dev/null +++ b/libs/weather-parsing/src/types.ts @@ -0,0 +1,34 @@ +// `row` is the 1-based spreadsheet row, so staff can find it in the sheet. It +// is absent when the problem is with the whole file. +export interface RowError { + row?: number; + column?: string; + reason: string; +} + +// Narrow with `ok === false`, not `!ok`: without strictNullChecks, which the +// lambdas don't enable, `!ok` doesn't narrow to the errors branch. +export type ParseResult = + | { ok: true; rows: T[] } + | { ok: false; errors: RowError[] }; + +// One row of the historical sheet: a daily_records row without stationId and +// importId, which come from the upload. Decimals stay strings, matching how +// pg reads numeric, so no precision is lost. +export interface HistoricalRecord { + month: number; + day: number; + highF: number | null; + highYears: number[] | null; + lowF: number | null; + lowYears: number[] | null; + precipIn: string | null; + precipYears: number[] | null; + snowIn: string | null; + snowYears: number[] | null; + peakGustMph: number | null; + peakGustDir: string | null; + peakGustIsEstimated: boolean; + peakGustYears: number[] | null; + notes: string | null; +} diff --git a/tsconfig.base.json b/tsconfig.base.json index d6659f047..171635add 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -12,7 +12,9 @@ "lib": ["es2020", "dom"], "skipLibCheck": true, "skipDefaultLibCheck": true, - "paths": {} + "paths": { + "@bho/weather-parsing": ["./libs/weather-parsing/src/index.ts"] + } }, "exclude": ["node_modules", "tmp"] }