Drop-frame timecode originates from a compromise invented when color NTSC video was invented. The NTSC designers wanted to retain compatibility with existing monochrome televisions. To minimise subcarrier visibility on a monochrome receiver it was necessary to make the color subcarrier an odd multiple of half the line scan frequency; the multiple originally chosen was 495. With a 30 Hz frame rate the line scan frequency is (30 × 525) = 15750 Hz. So the subcarrier frequency would have been (495/2 × 15750) = 3.898125 MHz. This was the subcarrier frequency originally chosen, but tests showed that on some monochrome receivers an interference pattern caused by the beat between the color subcarrier and the 4.5 MHz sound intercarrier could be seen. The visibility of this pattern could be greatly reduced by lowering the subcarrier frequency multiple to 455 (thus increasing the beat frequency from approx 600 kHz to approx 920 kHz) and by making the beat frequency also equal to an odd multiple of half the line scan frequency. This latter change could have been achieved by raising the sound intercarrier by 0.1% to 4.5045 MHz, but the designers, concerned that this might cause problems with some existing receivers, decided instead to reduce the color subcarrier frequency, and thus both the line scan frequency and the frame rate, by 0.1% instead. Thus the NTSC color subcarrier ended up as 3.57954545 MHz (exactly 315/88 MHz), the line scan frequency as 15734.27 Hz (exactly 9/572 MHz) and the frame rate 29.97 Hz (exactly 30/1.001 Hz).
This meant that an "hour of timecode" at a nominal frame rate of 30 frame/s, when played back at 29.97 frame/s was longer than an hour of wall-clock time by 3.6 seconds, leading to an error of almost a minute and a half over a day.
To correct this, drop-frame SMPTE timecode was invented. In spite of what the name implies, no video frames are dropped (skipped) using drop-frame timecode. Rather, some of the timecodes are dropped. In order to make an hour of timecode match an hour on the clock, drop-frame timecode skips frame numbers 0 and 1 of the first second of every minute, except when the number of minutes is divisible by ten (i.e. when minutes mod 10 equals zero). (Because editors making cuts must be aware of the difference in color subcarrier phase between even and odd frames, it is helpful to skip pairs of frame numbers.) This achieves an "easy-to-track" drop-frame rate of 18 frames each ten minutes (18,000 frames @ 30 frame/s) and almost perfectly compensates for the difference in rate, leaving a residual timing error of only 1.0 ppm, roughly 2.6 frames (86.4 milliseconds) per day.
That is, drop-frame TC drops 18 of 18,000 frame numbers, equivalent to 1⁄1000, achieving 30×0.999 = 29.97 frame/s. This is very slightly slower than the true NTSC frame rate of 30/1.001 = 29.97002997 frame/s, which is equivalent to dropping 1⁄1001 frame numbers. The difference is one additional NTSC frame per 1,000,000 drop-frame TC values, which is negligible.