Hurricane Harvey Post Storm Report

On August 26, 2017, Hurricane Harvey made landfall along the central Texas gulf coast as a category four hurricane. The storm weakened but remained stationary in southeast Texas spawing dozens of tornadoes and dropping over 30 inches of rain in many locations with isolated amounts of over 50 inches.

Harvey was the first major hurricane to strike the Texas coast since Hurricane Rita in 2005; the first category four hurricane to make landfall since Hurricane Bret in 1999.

In early September, National Weather Service (NWS) offices in Brownsville, Corpus Christi, San Antonio, and Houston, Texas, and Lake Charles, Louisiana released preliminary data reports on Hurricane Harvey. The following data has been extracted from those reports.

Hurricane Harvey

Advisories were initiated on Potential Tropical Cyclone Nine on the morning of August 17. Shortly thereafter, the cyclone was upgraded to a tropical storm but would not see additional strengthening as it moved into the eastern Caribbean Sea.

By the evening of August 19, Harvey had degenerated from a cyclone to a tropical wave (no closed center of circulation) and the National Hurricane Center discontinued issuing advisories on the system.

The full track of Hurricane Harvey is shown in Figure 1.

Hurricane Harvey had two life cycles as a tropical cyclone; the first in the western Atlantic and eastern Caribbean, and the second in the Gulf of Mexico.

Figure 1: Hurricane Harvey had two life cycles as a tropical cyclone; the first in the western Atlantic and eastern Caribbean, and the second in the Gulf of Mexico.

By midday August 23, the remnants of Harvey had regenerated back into a tropical depression while in the southern Gulf of Mexico. The NHC began reissuing advisories on the system.

Figure 2 shows the track of Hurricane Harvey after regeneration in the Gulf of Mexico. Once the cyclone redeveloped, it quickly began strengthening as it moved north and north-northwest towards the central Texas coastline. Figure 3 and Figure 5 show how the pressure and wind of Harvey changed rapidly as the storm intensified.

Hurricane Harvey track in the Gulf of Mexico where the system intensified quickly into a category four hurricane.

Figure 2: Hurricane Harvey track in the Gulf of Mexico where the system intensified quickly into a category four hurricane.

Barometric Pressure

Barometric pressure is the lowest atmospheric pressure either estimated or recorded in the center of a tropical cyclone. Generally speaking, the lower the barometric pressure, the stronger the cyclone.

Figure 3 shows the barometric pressure observations over 6-hour intervals during the life cycle of the cyclone. The gap from August 21 to August 23 is due to the system temporarily losing cyclone characteristics in the Caribbean Sea.

Hurricane Harvey central barometric pressure observations during the life cycle of the tropical cyclone.

Figure 3: Hurricane Harvey central barometric pressure observations during the life cycle of the tropical cyclone.

Figure 4 shows the lowest pressure observations as reported by the respective local NWS offices. As expected, the lowest values were recorded just north of Corpus Christi, Texas near the Rockport area where some locations reported pressure in the 940’s (mb). Table 1 shows the five lowest pressure observations recorded.

Rockport, Texas recorded the lowest pressure observations. Many observations are incomplete due to weather stations losing power or equipment during the storm.

Figure 4: Rockport, Texas recorded the lowest pressure observations. Many observations are incomplete due to weather stations losing power or equipment during the storm.

The minimum pressure observed was 941.8mb at RCPT in Rockport, TX. Official landfall occurred at 06:00 UTC on the morning of August 26, 2017; 2 1/2 hours after the RCPT observation. This is approximately the same reported minimum central pressure listed by the National Hurricane Center (NHC) in Public Advisory 23A which suggests pressure values may have been lower as the storm made passed over the station.

Table 1: Five lowest pressure observations (mb).
ID Station Lat Lon Pres PresDT PresRmks
RCPT2 ROCKPORT 28.02 -97.05 941.8 2017-08-26 03:36:00 I
CPNT2 COPANO BAY 28.11 -97.02 944.0 2017-08-26 04:00:00 I
RTAT2 PORT ARANSAS 27.84 -97.07 959.3 2017-08-26 02:24:00 NA
PTAT2 PORT ARANSAS CMAN 27.82 -97.05 961.7 2017-08-26 02:00:00 NA
ANPT2 PORT ARANSAS SENTINEL 27.83 -97.04 964.0 2017-08-26 02:02:00 I

The “I” in PresRmks denotes the observation is incomplete.

Many stations lost equipment during the height of the storm, leading to many incomplete data observations (at least 70).

Wind

Figure 5 shows the quick increase in wind during Harvey’s track over the Gulf of Mexico. It strengthened from a tropical depression to a category four hurricane in 60 hours; not record-breaking but quite impressive nonetheless.

Harvey strengthened from a tropical depression to category four hurricane in just over two days once in the Gulf of Mexico.

Figure 5: Harvey strengthened from a tropical depression to category four hurricane in just over two days once in the Gulf of Mexico.

Figure 6 shows the plot of all maximum wind values during Hurricane Harvey. As with barometric pressure, the highest wind values were recorded where Harvey made landfall but drop significantly at nearby locations.

Maximum sustained wind observations as reported by weather stations during Hurricane Harvey.

Figure 6: Maximum sustained wind observations as reported by weather stations during Hurricane Harvey.

The highest wind value was recorded at ANPT2 several hours prior to the center of the hurricane moving ashore. NWS CRP (Corpus Christi) reports,

ANPT2 SENTINEL STOPPED REPORTING AND MAY NOT HAVE RECORDED MAXIMUM EVENT VALUES

Table 2: Five highest wind observations (kts).
ID Station Lat Lon Wind WindDT
ANPT2 PORT ARANSAS SENTINEL 27.83 -97.04 96 2017-08-26 01:42:00
NSFDOW 28.08 -97.04 90 NA
CPNT2 COPANO BAY 28.11 -97.02 89 2017-08-26 03:06:00
FCMP 28.08 -97.05 88 NA
PTAT2 PORT ARANSAS CMAN 27.82 -97.05 83 2017-08-26 02:20:00

In addition to ANPT2, RCPT2 (Rockport), MAXT2, RTAT2, MIST2 and MIRT2 all failed prior to the peak of the hurricane. XWLD failed when the pier housing the sensor was swept away.

Table 3: Select Wind observations.
ID Station Lat Lon Wind WindDir WindDT WindRmks
ANPT2 PORT ARANSAS SENTINEL 27.83 -97.04 96 264 2017-08-26 01:42:00 I
MAXT2 COPANO EAST 28.13 -97.03 73 20 2017-08-26 02:00:00 I
RCPT2 ROCKPORT 28.02 -97.05 59 17 2017-08-26 01:54:00 I
MIST2 ARANSAS SHIP CHANNEL 27.83 -97.05 57 20 2017-08-25 22:00:00 I
RTAT2 PORT ARANSAS 27.84 -97.07 50 354 2017-08-25 22:42:00 I
XWLD WEATHERFLOW WILDCAT PORTLAND 27.86 -97.32 48 298 2017-08-26 03:55:00 I
MIRT2 MATAGORDA ISLAND RAWS 28.12 -96.80 44 59 2017-08-25 23:12:00 I

Rain

The story of Hurricane Harvey will always center around the significant flooding that took place as the hurricane weakened and stalled in southeast Texas. Harvey dropped record rainfall amounts across broad areas of southeast Texas turning highways into rivers and neighborhoods into lakes.

Several locations across southeast Texas recorded over 30" of rain with many isolated amounts of 40-50 inches.

Figure 7: Several locations across southeast Texas recorded over 30" of rain with many isolated amounts of 40-50 inches.

Though the news focus of the flooding was centered in the Houston area (Harris County), the largest rainfall amounts were recorded in Chambers, Brazoria, Liberty and Jefferson counties.

Table 4: Top 5 Rainfall Amounts
Location County Station Lat Lon Rain
FRIENDSWOOD GALVESTON 29.50 -95.20 56.00
3 ENE SANTA FE GALVESTON 29.39 -95.05 54.77
2 W FRIENDSWOOD GALVESTON 29.51 -95.22 54.00
3 S LEAGUE CITY GALVESTON 29.43 -95.11 52.87
2 NW WEBSTER HARRIS 29.55 -95.14 52.30

The text reports contain a Section D for Inland Flooding. Unfortunately at this time only the San Antonion/Austin NWS office have provided more info; generally river flooding and low water crossings.

Tornadoes

There are 24 tornado observations for Hurricane Harvey. However, some observations may be for the same tornado. For example, there are two observations for a tornado in Fort Bend county with the same Lat, Lat and Date value; only Details is different.

All tornadoes generated from Hurricane Harvey were relatively weak, as is typical of tropical cyclones.

Figure 8: All tornadoes generated from Hurricane Harvey were relatively weak, as is typical of tropical cyclones.

Table 5 shows all tornado observations during the event from each of the NWS offices. Table Six identifies wind range values for Scale.

Table 5: Tornado Remarks, Hurricane Harvey
Location County Lat Lon Date Scale Details
4 NNE SEADRIFT CALHOUN 28.43 -96.67 2017-08-25 21:14:00 EF0 FACEBOOK PHOTOS AND VIDEO SHOWED A BRIEF TORNADO TOUCHED DOWN ON GATES ROAD NEAR SEADRIFT. A SHED AND CARPORT WERE DESTROYED AND A FEW TREES WERE BLOWN DOWN. RATED EF0.
9 NE GALVESTON GALVESTON 29.22 -94.89 2017-08-25 19:23:00 EF0 PUBLIC REPORTS A FUNNEL CLOUD AND A METAL FENCE DAMAGED NEAR FERRY RD IN GALVESTON
2 W LIVERPOOL BRAZORIA 29.29 -95.31 2017-08-26 04:28:00 EF0 AN EF-0 TORNADO TOOK DOWN 4 POWER POLES ON HIGHWAY 35 ALONG WITH SEVERAL TREES NEAR THE GULF COAST SPEEDWAY. THE TORNADO THEN TRAVELED ACROSS GENERALLY OPEN FIELD BEFORE DAMAGING SOME BARNS AND OUTBUILDINGS AS WELL AS TREES ON COUNTY ROAD 511.
Table 6: Enhanced Fujita Scale
Scale WindMPH WindKTS
EF0 65-85 55-74
EF1 86-110 75-96
EF2 111-135 97-117
EF3 136-165 118-143
EF4 166-200 144-174
EF5 >200 >175

Code

These text products are listed under the header ACUS74. They can be found on the National Weather Service FTP server.

The following reports were obtained:

The links above point to the latest ACUS74 product issued by the respective NWS office. Therefore, it is possible that by the time you have read this article, the content of the text product has changed. Because of this, the rds data files have been saved to this website’s GitHub repository.

All times reported are in UTC. Pressure observations are in millibars. Wind and Gust observations are in knots.

Libraries

The following libraries were used in this article:

library(dplyr)
library(ggplot2)
library(ggrepel)
library(knitr)
library(lubridate)
library(pander)
library(purrr)
library(rrricanes)
library(rrricanesdata)
library(stringr)
library(tibble)
library(tidyr)

Data

To load the data, I just put the links into a named list. I originally had considered keeping the data separate by NWS office but determined this was not necessary.

The code below looks for the data file mentioned earlier and, if it exists, loads the txt vector. Otherwise, each of the text products will be collected for parsing.

Each text product contains several sections:

  • Section A. Lowest Sea Level Pressure/Maximum Sustained Winds and Peak Gusts

    • Non-METAR Observations
  • Section B. Marine Observations

  • Section C. Storm Total Rainfall

  • Section D. Inland Flooding (not collected)

  • Section E. Maximum Storm Surge and Storm Tide (not collected)

  • Section F. Tornadoes

  • Section G. Storm Impacts by County (not collected)

Not all sections will contain data. For this article, all data collected was that which contained a latitude and longitude position.

Each section contains a data header:

A. LOWEST SEA LEVEL PRESSURE/MAXIMUM SUSTAINED WINDS AND PEAK GUSTS
---------------------------------------------------------------------
METAR OBSERVATIONS...
NOTE: ANEMOMETER HEIGHT IS 10 METERS AND WIND AVERAGING IS 2 MINUTES
---------------------------------------------------------------------
LOCATION  ID    MIN    DATE/     MAX      DATE/     PEAK    DATE/
LAT  LON        PRES   TIME      SUST     TIME      GUST    TIME
DEG DECIMAL     (MB)   (UTC)     (KT)     (UTC)     (KT)    (UTC)
---------------------------------------------------------------------
B. MARINE OBSERVATIONS...
NOTE: ANEMOMETER HEIGHT IN METERS AND WIND AVERAGING PERIOD IN
MINUTES INDICATED UNDER MAXIMUM SUSTAINED WIND IF KNOWN
---------------------------------------------------------------------
LOCATION  ID    MIN    DATE/     MAX      DATE/     PEAK    DATE/
LAT  LON        PRES   TIME      SUST     TIME      GUST    TIME
DEG DECIMAL     (MB)   (UTC)     (KT)     (UTC)     (KT)    (UTC)
---------------------------------------------------------------------

Additionally, a subsection of A exists:

NON-METAR OBSERVATIONS... 
NOTE: ANEMOMETER HEIGHT IN METERS AND WIND AVERAGING PERIOD IN
MINUTES INDICATED UNDER MAXIMUM SUSTAINED WIND IF KNOWN
---------------------------------------------------------------------
LOCATION  ID    MIN    DATE/     MAX      DATE/     PEAK    DATE/
LAT  LON        PRES   TIME      SUST     TIME      GUST    TIME
DEG DECIMAL     (MB)   (UTC)     (KT)     (UTC)     (KT)    (UTC)
---------------------------------------------------------------------

This subsection was added in as part of Sectoin A but is indistinguishable in the parsed dataset.

Observation examples are inluded in the relevant section below.

Numerous observations contain remarks (identified in the dataset by ends_with("Rmks")). Every section contains a Remarks footer; however, this may not be populated and, therefore, not every observation with a .Rmks variable would have additional Remarks listed in the text product. The additional Remarks were not collected.

The .Rmks legend is identified in the footer of each text product as:

  • “I” - Incomplete data

  • “E” - Estimated

All .Rmks variables in the datasets are either NA or “I”.

Sections A and B may also contain additional anenometer height and wind-averaging period variables on a third line. This data was not collected but could easily have been; I did not feel it was relevant to this article.

Sea Level Pressure and Marine Observations

A typical observation in Section A or B will look like the following:

RCPT2-ROCKPORT                                                      
28.02  -97.05   941.8 26/0336 I 017/059  26/0154 I 016/094 26/0148 I

There are 15 variables in the observation above (in order as they appear, with the example text):

  • ID (RCPT2)

  • Station (ROCKPORT)

  • Lat (28.02)

  • Lon (-97.05)

  • Pres (941.8) [barometric pressure, mb]

  • PresDT (26/0336) [date/time of Pres observation, UTC]

  • PresRmks (I) [incomplete pressure observation]

  • Wind, WindDir (017/059) [wind speed, kts, and wind direction]

  • WindDT (26/0154) [date/time of preceeding wind observation, UTC]

  • WindRmks (I) [incomplete wind observation]

  • Gust, GustDir (016/094) [maximum gust, kts, and direction]

  • GustDT (26/0148) [date/time of preceeding gust observation, UTC]

  • GustRmks (I) [incomplete gust observation]

Every observation has an empty line before and after which can be used as a delimiter to spilt observations.

But, first, I need to extract the relevant sections. To do this, I loop through the text products (txt) and identify where Section A and Section C begins. With these numerical indices, I can extract both sections, assigning the subset to slp_raw.

slp_raw <- c(map(txt, ~.[grep("^A\\.", .):grep("^C\\.", .)])) %>% 
  flatten_chr()

From there, I identify all vector elements that begin with a latitude and longitude field. I counted these values (slp_n) so that I know exactly how long my final results will be (and to check progress as I move along, making sure I haven’t inadvertently removed anything).

Once I know where the observation indices are (slp_obs_n) I can find the station identification by calculating slp_obs_n - 1; this gives me slp_stations_n.

slp_obs_ptn <- "^\\d\\d\\.\\d\\d\\s*-*\\d\\d\\d*\\.\\d\\d.+"
slp_n <- sum(str_count(slp_raw, slp_obs_ptn))
slp_obs_n <- str_which(slp_raw, slp_obs_ptn)
slp_stations_n <- slp_obs_n - 1

Before merging the two vectors, I found some station values were not all the same length; I felt this would be beneficial with the regex. I create slp_stations, first trimming all values then finding the max length value. With the max length, I rounded up to the nearest ten and padded all all values to the right.

The last bit of manipulation involved replacing the first “-”, if available, with a “\t” character. This also helped me make it easier to split variables ID and Station since Station would contain additional “-” characters.

slp_stations <- slp_raw[slp_stations_n] %>% 
  str_trim() %>% 
  str_pad(width = round(max(nchar(.)), digits = -1), side = "right") %>% 
  # Replace first "-" with "\t" to help split ID and Station
  str_replace("\\s*-\\s*", "\t")

Note that the code above split ID “TXCV-4” which would later be corrected.

Finally, I subset slp_obs and then with slp_stations make vector slp.

slp_obs <- slp_raw[slp_obs_n]
slp <- str_c(slp_stations, slp_obs)

Following is a look at the head of slp:

head(slp, n = 5L)
## [1] "KBRO\tBROWNSVILLE INTL ARPT                        25.91 -97.42   1002.9 25/1153   300/022  25/1853   290/032 25/1753  "
## [2] "KHRL\tHARLINGEN VALLEY INTL ARPT                   26.22 -97.66   1003.6 25/1252   310/023  25/1841   310/033 25/1852  "
## [3] "KPIL\tPORT ISABEL ARPT                             26.15 -97.23   1001.9 25/1253   300/024  25/1553   300/034 25/1453  "
## [4] "KBKS\tBROOKS COUNTY ARPT                           26.20 -98.12   1002.2 26/0215   290/019  26/0215   290/027 26/0215  "
## [5] "KTXS33                                            26.13 -97.17   1003.0 25/2240   999/999  99/9999   999/999 99/9999  "
ID [ID], Station [Station] (opt)

Matching ID and Station is easier after switching the first “-” with a “\t”. Station is optional. To find the end of the string I simply looked for the latitude pattern that would follow.

                  # ID-Station
                  "(\\w+)\t*(?<=\t{0,1})(.+)(?=\\s+\\d{2}\\.\\d{2})",

In some cases, for Station, old data seems to exist from previous instances of this product; particularly, “XDUL”. Notice the text that seems to reference “Tropical Storm Cindy”:

slp[grep("^XDUL", slp)]
## [1] "XDUL\tWEATHERFLOW DULAC                            29.34 -90.73   1001.2 08/0054   090/018 07/1754    090/031 07/1754  "

For that record, I left as-is.

Latitude [Lat]

Latitude was also very easy to extract. The pattern just looks for four digits with a decimal splitting in half.

                  # Lat
                  "\\s+(\\d{2}\\.\\d{2})",
Longitude [Lon]

Extracting Longitude was a little bit more of a challenge. Most observations have a negative longitude value (since occurring in the northwestern hemisphere). This was accurately reflected in the text products; mostly. Some values did not contain the leading “-” such as Station “KEFD”:

slp[grep("^KEFD", slp)][2]
## [1] "KEFD                                              29.62 95.17    1003.4 29/1650   160/027  26/1750   360/036 29/2150  "

Additionally, “KXPY” just had a bad value:

slp[grep("^KXPY", slp)]
## character(0)

“KXPY” would later be corrected manually using my best guess.

# Correct the Lon for KXPY. Google Maps puts Port Fourchon at 
# 29.1055584,-90.2119496. Current values are 29.12, -903202.00. 
# I'll modify -903202.00 to -90.32
slp_df$Lon[slp_df$ID == "KXPY" & slp_df$Lon == -903202.00] <- -90.32

To accomodate the possibilities, I had to be loose with the number of digits expected in addition to making the negative sign optional.

                  # Lon
                  "\\s+-*(\\d{2,6}\\.\\d{2})",
Minimum Pressure [Pres] opt

Expected pressure values would have a format like \\d{3,4}\\.\\d{2}. This would not be the case as there were many “0.0” values such as “FADT2”:

slp[grep("^FADT2", slp)]
## character(0)

Some observations even had values of “9999.0” which clearly were invalid (expected ranges were roughly between 940 and 1010). These would later be cleaned up.

                  # Pres
                  "\\s+(\\d{1,4}\\.\\d{1})*",
Date/time of pressure observation [PresDT] opt

PresDT was initially split to extract the date value first (PresDTd) followed by the “%h%m” value (PresDThm). The general format, “\d{2}/\d{4}” would not work primarily because many observations contained the text “MM” or “N/A”.

Additionally, some observations also held the value “99/9999”. This would be accepted by the default format but would fail when converting the values to a valid date/time variable. These would later be cleaned.

With this, I ended up being very generous with the regex.

                  # PresDTd, PresDThm
                  "\\s+(\\w{1,3}|N)*/*(\\w{1,4})*",
Pressure remarks [PresRmks] opt

As noted previously, some Pres variables may be incomplete for unknown reasons. These values would be indicated with the letter “I” as noted in the “RCPT2” example earlier.

                  # PresRmks
                  "\\s+(I)*",
Maximum sustained wind direction [WindDir], Maximum sustained winds (opt) [Wind]

Variables WindDir and Wind were split with a “/” character. However, again, not all values were numeric as expected, such as “LOPL1”:

slp[grep("^LOPL1", slp)]
## [1] "LOPL1\tLA OFFSHORE OIL PORT                        28.88  -90.03   998.1 07/2216   080/029 07/2011    090/037 07/1811  "

Invalid values such as “999” would later be marked as NA.

                  # WindDir, Wind
                  "\\s+(\\w{3})/(\\d{3})", 

The remaining variables followed generally the same rules as similar variables above (i.e., GustDir for WindDir, GustDT for WindDT, etc.). The final str_match call brought all expected observations in order.

# Begin extraction. Move to dataframe and rename variables.
slp_df <- str_match(slp, 
          sprintf("^%s%s%s%s%s%s%s%s%s%s%s%s$", 
                  # ID-Station
                  "(\\w+)\t*(?<=\t{0,1})(.+)(?=\\s+\\d{2}\\.\\d{2})",
                  # Lat
                  "\\s+(\\d{2}\\.\\d{2})",
                  # Lon
                  "\\s+-*(\\d{2,6}\\.\\d{2})",
                  # Pres
                  "\\s+(\\d{1,4}\\.\\d{1})*",
                  # PresDTd, PresDThm
                  "\\s+(\\w{1,3}|N)*/*(\\w{1,4})*",
                  # PresRmks
                  "\\s+(I)*",
                  # WindDir, Wind
                  "\\s+(\\w{3})/(\\d{3})", 
                  # Wind DTd, WindDThm
                  "\\s+(\\d{2,3})*/*(\\d{3,4})*", 
                  # WindRmks
                  "\\s+(I)*", 
                  # GustDir, Gust
                  "\\s+(\\w{3})*/*(\\d{3})*", 
                  # GustDTd, GustDThm
                  "\\s+(\\d{2,3})*/*(\\d{3,4})*", 
                  # GustRmks
                  "\\s+(I)*")) %>% 
  as_data_frame()

Rainfall

Section C of the text products listed recorded rainfall observations across the Texas and Louisiana area. These observations were similar in format to those of pressure:

COLETO CREEK                 GOLIAD              CKDT2         9.42 I
28.73  -97.17

The following fields were extracted:

  • Location (“COLETO CREEK”)

  • Count (“GOLIAD”)

  • Station (“CKDT2”) opt

  • Rain (“9.42”)

  • RainRmks (“I”)

  • Lat (“28.73”)

  • Lon (“-97.17”)

Extracting these observations followed the same premise for that of slp; identifying the latitude lines then subsetting those indices and the previous indices and combining into a vector.

Unlike slp, there were no surprises in cleaning this data. The regex used:

rain_df <- str_match(rain,
                 pattern = sprintf("^%s%s\\s+%s\\s+%s\\s*%s\\s+%s\\s+%s$", 
                                   "(.{29})", 
                                   "(.{19})", 
                                   "(.{0,12})",
                                   "(\\d{1,2}\\.\\d{2})", 
                                   "(I)*", 
                                   "(\\d{1,2}\\.\\d{2})",
                                   "-*(\\d{2,3}\\.\\d{2})")) %>% 
  as_data_frame() %>% 
  rename(txt = V1, Location = V2, County = V3, Station = V4, Rain = V5, 
         RainRmks = V6, Lat = V7, Lon = V8) %>% 
  mutate_at(.vars = c("Rain", "Lat", "Lon"), .funs = as.numeric) %>% 
  mutate(Lon = if_else(Lon > 0, Lon * -1, Lon)) %>% 

Tornadoes

Section F lists reported tornadoes for each region of responsibility. Some NWS offices reported no tornado observations. Others, such as Houston, reported at least a dozen.

An example observation is as follows:

4 NNE SEADRIFT               CALHOUN          25/2114          EF0   
28.43  -96.67

FACEBOOK PHOTOS AND VIDEO SHOWED A BRIEF TORNADO TOUCHED DOWN ON
GATES ROAD NEAR SEADRIFT. A SHED AND CARPORT WERE DESTROYED AND A
FEW TREES WERE BLOWN DOWN. RATED EF0. 

Each observation, again, was preceeded and proceeded by an empty line.

  • Location (“4 NNE SEADRIFT”)

  • County (“CALHOUN”)

  • Date (“25/2114”)

  • Scale (“EFO”)

  • Lat (“28.43”)

  • Lon (“-96.67”)

  • Details (“FACEBOOK PHOTOS…”)

Extracting the first two lines used the same technique as previous. However, extracting the Details required a little creativity since many spread over several lines.

To do this, I took the values of tor_y_n which marked the indices of the latitude/longitude positions. Then, I created vector tor_z_n to identify all “^\s+” elements in the original vector, tor_raw. With this, I was able to identify the first “^\s+” index following the latitude/longitude line, t_a and then take the very next index, t_b.

Apologies for the non-descriptive names; I was lacking ingenuity.

With t_a and t_b, I used map2 through tor_raw to extract each subset. From that point there was some cleaning to bring the lines together as needed. If you have any better (even if slower, but more creative), I would love to hear them! I may have tried to get too creative with this task.

The regex was very similar to the rain regex as most items were evenly delimited.

Previous Versions

Session Info

pander::pander(sessionInfo())

R version 3.4.3 (2017-11-30)

**Platform:** x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=C, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=C

attached base packages: methods, stats, graphics, grDevices, utils, datasets and base

other attached packages: bindrcpp(v.0.2), tidyr(v.0.8.0), tibble(v.1.4.2), stringr(v.1.2.0), rrricanesdata(v.0.0.1.6), rrricanes(v.0.2.0-6), purrr(v.0.2.4), pander(v.0.6.1), lubridate(v.1.7.1), knitr(v.1.18), ggrepel(v.0.7.0), ggplot2(v.2.2.1) and dplyr(v.0.7.4)

loaded via a namespace (and not attached): Rcpp(v.0.12.15), highr(v.0.6), RColorBrewer(v.1.1-2), pillar(v.1.1.0), compiler(v.3.4.3), plyr(v.1.8.4), bindr(v.0.1), tools(v.3.4.3), digest(v.0.6.15), lattice(v.0.20-35), evaluate(v.0.10.1), gtable(v.0.2.0), pkgconfig(v.2.0.1), rlang(v.0.1.6), yaml(v.2.1.16), blogdown(v.0.4), rnaturalearthdata(v.0.1.0), rprojroot(v.1.3-2), grid(v.3.4.3), glue(v.1.2.0), R6(v.2.2.2), rmarkdown(v.1.8), bookdown(v.0.5), sp(v.1.2-5), magrittr(v.1.5), backports(v.1.1.2), scales(v.0.5.0), htmltools(v.0.3.6), assertthat(v.0.2.0), colorspace(v.1.3-2), labeling(v.0.3), stringi(v.1.1.6), lazyeval(v.0.2.1) and munsell(v.0.4.3)

warnings()
## NULL
Next
Previous
comments powered by Disqus