The difficulty adjusts with each block.

The adjustment algorithm examines 720 prior blocks, starting from 15 blocks ago.

Of those 720 blocks, the 60 highest and lowest block times are excluded from the analysis, which leaves 600 blocks.

Out of those 600 blocks, the average block time is determined. This average is then used to adjust the difficulty proportionally in order to target a 120 second block time. Difficulty is defined as the number of hash attempts required, on average, to find a valid hash for the block every 120 seconds. The unit of difficulty is therefore "hashes".

When there is a large and sudden change in hashrate, e.g. due to the April 6th 2018 PoW change, it will therefore take 15+60=75 blocks before the change in hashrate starts to affect the difficulty. The change to difficulty when adjusting to the new hashrate will be gradual, and after 15+60+600=675 blocks the new hashrate will have been fully taken into account by the algorithm.

When you see web sites display a "network hash rate" statistic, what those sites are actually doing is inferring the network hash rate from the current difficulty. The actual current network hash rate can only be indirectly inferred by observing how quickly blocks are being mined.

Credit for this answer goes to smooth from his comment here: https://www.reddit.com/r/Monero/comments/8a9wof/the_actual_drop_on_hash_power/dwxxiek/