library(oce)
d <- read.csv('wind.csv', stringsAsFactors = FALSE)
d$time <- as.POSIXct(d$date, tz='UTC')
Note that the date is provided only as days, but they appear to be hourly observations, so I’m going to fudge the times:
d$time <- d$time + rep(seq(0, 86399, 3600), length(unique(d$date)))
Now calculate the \(u\) and \(v\) components:
d$u <- d$speed*cos(d$direction*pi/180)
d$v <- d$speed*sin(d$direction*pi/180)
Before we try a stick plot, let’s just look at the \(u\) and \(v\) time series:
par(mfrow=c(2, 1))
oce.plot.ts(d$time, d$u, ylab='u')
oce.plot.ts(d$time, d$v, ylab='v')

If we want to filter the data to smooth it for the stick plot, we can do so using a number of methods. One option is to use the signal
package, and specify a filter, e.g. Butterworth.
library(signal)
bw <- butter(1, 0.1) # lowpass with normalized cutoff of 0.1
t <- d$time
uf <- filtfilt(bw, d$u)
vf <- filtfilt(bw, d$v)
par(mfrow=c(2, 1))
oce.plot.ts(t, d$u, ylab='u')
lines(t, uf, col=2)
oce.plot.ts(t, d$v, ylab='v')
lines(t, vf, col=2)

And make a plot:
plotSticks(t, 0, d$u, d$v, yscale=10, ylab='', yaxt='n', length=0)

If we use the filtered data instead, it looks a little cleaner:
plotSticks(t, 0, uf, vf, yscale=10, xlab='', ylab='', yaxt='n', length=0)

Another way of plotting wind data is to use a windrose
object, and the associated plotting methods:
plot(as.windrose(d$u, d$v))

LS0tDQp0aXRsZTogIlN0aWNrcGxvdHMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkob2NlKQ0KZCA8LSByZWFkLmNzdignd2luZC5jc3YnLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQpkJHRpbWUgPC0gYXMuUE9TSVhjdChkJGRhdGUsIHR6PSdVVEMnKQ0KYGBgDQoNCk5vdGUgdGhhdCB0aGUgZGF0ZSBpcyBwcm92aWRlZCBvbmx5IGFzICpkYXlzKiwgYnV0IHRoZXkgYXBwZWFyIHRvIGJlIGhvdXJseSBvYnNlcnZhdGlvbnMsIHNvIEknbSBnb2luZyB0byBmdWRnZSB0aGUgdGltZXM6DQpgYGB7cn0NCmQkdGltZSA8LSBkJHRpbWUgKyByZXAoc2VxKDAsIDg2Mzk5LCAzNjAwKSwgbGVuZ3RoKHVuaXF1ZShkJGRhdGUpKSkNCmBgYA0KDQpOb3cgY2FsY3VsYXRlIHRoZSAkdSQgYW5kICR2JCBjb21wb25lbnRzOg0KYGBge3J9DQpkJHUgPC0gZCRzcGVlZCpjb3MoZCRkaXJlY3Rpb24qcGkvMTgwKQ0KZCR2IDwtIGQkc3BlZWQqc2luKGQkZGlyZWN0aW9uKnBpLzE4MCkNCmBgYA0KDQpCZWZvcmUgd2UgdHJ5IGEgc3RpY2sgcGxvdCwgbGV0J3MganVzdCBsb29rIGF0IHRoZSAkdSQgYW5kICR2JCB0aW1lIHNlcmllczoNCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwgMSkpDQpvY2UucGxvdC50cyhkJHRpbWUsIGQkdSwgeWxhYj0ndScpDQpvY2UucGxvdC50cyhkJHRpbWUsIGQkdiwgeWxhYj0ndicpDQpgYGANCklmIHdlIHdhbnQgdG8gZmlsdGVyIHRoZSBkYXRhIHRvIHNtb290aCBpdCBmb3IgdGhlIHN0aWNrIHBsb3QsIHdlIGNhbiBkbyBzbyB1c2luZyBhIG51bWJlciBvZiBtZXRob2RzLiBPbmUgb3B0aW9uIGlzIHRvIHVzZSB0aGUgYHNpZ25hbGAgcGFja2FnZSwgYW5kIHNwZWNpZnkgYSBmaWx0ZXIsIGUuZy4gQnV0dGVyd29ydGguDQpgYGB7cn0NCmxpYnJhcnkoc2lnbmFsKQ0KYncgPC0gYnV0dGVyKDEsIDAuMSkgIyBsb3dwYXNzIHdpdGggbm9ybWFsaXplZCBjdXRvZmYgb2YgMC4xDQp0IDwtIGQkdGltZQ0KdWYgPC0gZmlsdGZpbHQoYncsIGQkdSkNCnZmIDwtIGZpbHRmaWx0KGJ3LCBkJHYpDQpwYXIobWZyb3c9YygyLCAxKSkNCm9jZS5wbG90LnRzKHQsIGQkdSwgeWxhYj0ndScpDQpsaW5lcyh0LCB1ZiwgY29sPTIpDQpvY2UucGxvdC50cyh0LCBkJHYsIHlsYWI9J3YnKQ0KbGluZXModCwgdmYsIGNvbD0yKQ0KYGBgDQoNCkFuZCBtYWtlIGEgcGxvdDoNCmBgYHtyfQ0KcGxvdFN0aWNrcyh0LCAwLCBkJHUsIGQkdiwgeXNjYWxlPTEwLCB5bGFiPScnLCB5YXh0PSduJywgbGVuZ3RoPTApDQpgYGANCg0KSWYgd2UgdXNlIHRoZSBmaWx0ZXJlZCBkYXRhIGluc3RlYWQsIGl0IGxvb2tzIGEgbGl0dGxlIGNsZWFuZXI6DQpgYGB7cn0NCnBsb3RTdGlja3ModCwgMCwgdWYsIHZmLCB5c2NhbGU9MTAsIHhsYWI9JycsIHlsYWI9JycsIHlheHQ9J24nLCBsZW5ndGg9MCkNCmBgYA0KDQpBbm90aGVyIHdheSBvZiBwbG90dGluZyB3aW5kIGRhdGEgaXMgdG8gdXNlIGEgYHdpbmRyb3NlYCBvYmplY3QsIGFuZCB0aGUgYXNzb2NpYXRlZCBwbG90dGluZyBtZXRob2RzOg0KYGBge3J9DQpwbG90KGFzLndpbmRyb3NlKGQkdSwgZCR2KSkNCmBgYA==