Mở đầu
Bài này sẽ giới thiệu các làm việc với date và time trong R. Tối sẽ tóm tắt sự khác nhau giữa as.Date, POSIXct và * POSIXlt* sử dụng để biến đổi date/time từ character (string) format sang date/time format được sử dụng trong R. Việc chuyển đổi này sẽ hỗ trợ hiệu quả khi xây dựng biểu đồ (plotting), trích xuất (subsetting) và phân tích dữ liệu chuỗi thời gian.
R Skill Level: Intermediate - Bạn cần nắm và hiều được basics của R và hiểu cấu trúc chung của dữ liệu bảng.
Mục đích: Sau khi kết thúc bài này, các bạn sẽ:
- Hiểu được các date-time classes và cấu trúc dữ liệu trong R.
- Hiểu được POSIXct và POSIXlt là gì và tại sao trong một số bài toán thì POSIXct có thể được ưu tiên sử dụng hơn.
- Có thể biến đổi một cột chứa thông tin date-time ở character format về date-time R class.
- Có thể biến đổi date-time column về các date-time classes khác nhau.
- Biết được cách viết date-time class object bằng nhiều phương thức khác nhau (month-day-year, etc).
Yêu cầu để học bài này: Bạn sẽ cần cài đặt phiên bản R mới nhất, và tốt hơn hết là tối khuyên các bạn nên dùng Rstudio để hoàn thành bài học này.
Cài đặt R Packages: lubridate
# install.packages("lubridate")
Tải data:
Data sử dụng trong bài này được thu thập từ http://www.neonscience.org/, http://www.neonscience.org/field-sites/field-sites-map/HARV
các bạn có thể tải ở đây: http://neondataskills.org/R/brief-tabular-time-series-qplot/
** Tiếp cận dữ liệu: Trong bài này tôi sẽ hướng dẫn các bạn cách làm việc với column có chứa cả date** và time stamp. Tối sẽ sử dụng các functions từ cả base R và lubridate package để làm việc với date-time data classes.
# Load packages required for entire script
library(lubridate) #work with dates
# set working directory to ensure R can find the file we wish to import
# setwd("working-dir-path-here")
Import CSV file: Đàu tiên chúng ta hãy cùng import time series data. Chúng ta sử dụng hf001-10-15min-m.csv file chứa atmospheric data for the NEON Harvard Forest vơi 15-minute intervals.
# Load csv file of 15 min meteorological data from Harvard Forest
# Factors=FALSE so strings, series of letters/words/numerals, remain characters
harMet_15Min <- read.csv(
file="NEON-DS-Met-Time-Series/HARV/FisherTower-Met/hf001-10-15min-m.csv",
stringsAsFactors = FALSE)
# View first 10 rows of data
head(harMet_15Min, 10)
stringsAsFactors=FALSE: Khi đọc files chúng trong R chúng ta hầu hết thường sử dụng stringsAsFactors = FALSE. Thiết lập này đảm bảo rằng non-numeric (string) không được chuyển về dạng factors.
Dữ liệu Date và Time:
Chúng ta hãy cùng kiểm tra class của của cột datetime trong bảng dữ liệu:
# view column data class
class(harMet_15Min$datetime)
[1] "character"
## [1] "character"
# view sample data
head(harMet_15Min$datetime)
[1] "2005-01-01T00:15" "2005-01-01T00:30" "2005-01-01T00:45"
[4] "2005-01-01T01:00" "2005-01-01T01:15" "2005-01-01T01:30"
Cột datetime trong bảng dữ liệu của chúng ta là character class. Vì vậy chúng ta cần biến đổi nó về date-time class. Điều gì sẽ xảy ra khi chúng ta sử dụng as.Date method?
# convert column to date class
dateOnly_HARV <- as.Date(harMet_15Min$datetime)
# view data
head(dateOnly_HARV)
[1] "2005-01-01" "2005-01-01" "2005-01-01" "2005-01-01" "2005-01-01"
[6] "2005-01-01"
## [1] "2005-01-01" "2005-01-01" "2005-01-01" "2005-01-01" "2005-01-01"
## [6] "2005-01-01"
Khi sử dụng as.Date chúng ta sẽ bị mất time stamp.
Explore Date and Time Classes
R - Date Class - as.Date:
Chúng ta mới thấy rằng as.Date không lưu bất kỳ thông tin về thời gian nào. Khi chúng ta sử dụng as.Date method để biến đổi date dạng character class sẽ được lưu vè dạng R date class, nó sẽ bỏ qua tất cả các thông tin phía sau date string.
# Convert character data to date (no time)
myDate <- as.Date("2015-10-19 10:15")
str(myDate)
Date[1:1], format: "2015-10-19"
## Date[1:1], format: "2015-10-19"
# what happens if the date has text at the end?
myDate2 <- as.Date("2015-10-19Hello")
str(myDate2)
Date[1:1], format: "2015-10-19"
## Date[1:1], format: "2015-10-19"
Chúng ta có thể thấy là as.Date function sẽ biến đổi characters mà được xác định là part của date vè date class và bỏ qua tất cả các characters khác ở dạng string.
R - Date-Time - The POSIX classes:
LS0tDQp0aXRsZTogIkzDoG0gdmnhu4djIHbhu5tpIERhdGUgdsOgIFRpbWUgdHJvbmcgUiAtIGFzLkRhdGUsIFBPU0lYY3QsIFBPU0lYbHQiDQphdXRoZXI6IEN1b25nIFNhaQ0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KKipN4bufIMSR4bqndSoqDQoNCkLDoGkgbsOgeSBz4bq9IGdp4bubaSB0aGnhu4d1IGPDoWMgbMOgbSB2aeG7h2MgduG7m2kgZGF0ZSB2w6AgdGltZSB0cm9uZyBSLiBU4buRaSBz4bq9IHTDs20gdOG6r3Qgc+G7sSBraMOhYyBuaGF1IGdp4buvYSAqYXMuRGF0ZSosICpQT1NJWGN0KiB2w6AgKiBQT1NJWGx0KiBz4butIGThu6VuZyDEkeG7gyBiaeG6v24gxJHhu5VpIGRhdGUvdGltZSB04burIGNoYXJhY3RlciAoc3RyaW5nKSBmb3JtYXQgc2FuZyBkYXRlL3RpbWUgZm9ybWF0IMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIFIuIFZp4buHYyBjaHV54buDbiDEkeG7lWkgbsOgeSBz4bq9IGjhu5cgdHLhu6MgaGnhu4d1IHF14bqjIGtoaSB4w6J5IGThu7FuZyBiaeG7g3UgxJHhu5MgKHBsb3R0aW5nKSwgdHLDrWNoIHh14bqldCAoc3Vic2V0dGluZykgdsOgIHBow6JuIHTDrWNoIGThu68gbGnhu4d1IGNodeG7l2kgdGjhu51pIGdpYW4uDQoNCioqUiBTa2lsbCBMZXZlbCoqOiBJbnRlcm1lZGlhdGUgLSBC4bqhbiBj4bqnbiBu4bqvbSB2w6AgaGnhu4F1IMSRxrDhu6NjIGJhc2ljcyBj4bunYSBSIHbDoCBoaeG7g3UgY+G6pXUgdHLDumMgY2h1bmcgY+G7p2EgZOG7ryBsaeG7h3UgYuG6o25nLg0KDQoqKk3hu6VjIMSRw61jaCoqOiBTYXUga2hpIGvhur90IHRow7pjIGLDoGkgbsOgeSwgY8OhYyBi4bqhbiBz4bq9Og0KDQotIEhp4buDdSDEkcaw4bujYyBjw6FjIGRhdGUtdGltZSBjbGFzc2VzIHbDoCBj4bqldSB0csO6YyBk4buvIGxp4buHdSB0cm9uZyBSLg0KLSBIaeG7g3UgxJHGsOG7o2MgUE9TSVhjdCB2w6AgUE9TSVhsdCBsw6AgZ8OsIHbDoCB04bqhaSBzYW8gdHJvbmcgbeG7mXQgc+G7kSBiw6BpIHRvw6FuIHRow6wgUE9TSVhjdCBjw7MgdGjhu4MgxJHGsOG7o2MgxrB1IHRpw6puIHPhu60gZOG7pW5nIGjGoW4uDQotIEPDsyB0aOG7gyBiaeG6v24gxJHhu5VpIG3hu5l0IGPhu5l0IGNo4bupYSB0aMO0bmcgdGluIGRhdGUtdGltZSDhu58gY2hhcmFjdGVyIGZvcm1hdCB24buBIGRhdGUtdGltZSBSIGNsYXNzLg0KLSBDw7MgdGjhu4MgYmnhur9uIMSR4buVaSBkYXRlLXRpbWUgY29sdW1uIHbhu4EgY8OhYyBkYXRlLXRpbWUgY2xhc3NlcyBraMOhYyBuaGF1Lg0KLSBCaeG6v3QgxJHGsOG7o2MgY8OhY2ggdmnhur90IGRhdGUtdGltZSBjbGFzcyBvYmplY3QgYuG6sW5nIG5oaeG7gXUgcGjGsMahbmcgdGjhu6ljIGtow6FjIG5oYXUgKG1vbnRoLWRheS15ZWFyLCBldGMpLg0KDQoqKlnDqnUgY+G6p3UgxJHhu4MgaOG7jWMgYsOgaSBuw6B5Kio6IELhuqFuIHPhur0gY+G6p24gY8OgaSDEkeG6t3QgcGhpw6puIGLhuqNuIFIgbeG7m2kgbmjhuqV0LCB2w6AgdOG7kXQgaMahbiBo4bq/dCBsw6AgdOG7kWkga2h1ecOqbiBjw6FjIGLhuqFuIG7Dqm4gZMO5bmcgUnN0dWRpbyDEkeG7gyBob8OgbiB0aMOgbmggYsOgaSBo4buNYyBuw6B5LiANCg0KKipDw6BpIMSR4bq3dCBSIFBhY2thZ2VzKio6ICpsdWJyaWRhdGUqDQoNCmBgYHtyfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJsdWJyaWRhdGUiKQ0KYGBgDQoNCioqVOG6o2kgZGF0YSoqOg0KDQpEYXRhIHPhu60gZOG7pW5nIHRyb25nIGLDoGkgbsOgeSDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sgaHR0cDovL3d3dy5uZW9uc2NpZW5jZS5vcmcvLCBodHRwOi8vd3d3Lm5lb25zY2llbmNlLm9yZy9maWVsZC1zaXRlcy9maWVsZC1zaXRlcy1tYXAvSEFSVg0KDQpjw6FjIGLhuqFuIGPDsyB0aOG7gyB04bqjaSDhu58gxJHDonk6IGh0dHA6Ly9uZW9uZGF0YXNraWxscy5vcmcvUi9icmllZi10YWJ1bGFyLXRpbWUtc2VyaWVzLXFwbG90Lw0KDQoqKiBUaeG6v3AgY+G6rW4gZOG7ryBsaeG7h3UqKjogVHJvbmcgYsOgaSBuw6B5IHTDtGkgc+G6vSBoxrDhu5tuZyBk4bqrbiBjw6FjIGLhuqFuIGPDoWNoIGzDoG0gdmnhu4djIHbhu5tpIGNvbHVtbiBjw7MgY2jhu6lhIGPhuqMgKipkYXRlKiogdsOgICoqdGltZSBzdGFtcCoqLiBU4buRaSBz4bq9IHPhu60gZOG7pW5nIGPDoWMgZnVuY3Rpb25zIHThu6sgY+G6oyBiYXNlIFIgdsOgICoqbHVicmlkYXRlKiogcGFja2FnZSDEkeG7gyBsw6BtIHZp4buHYyB24bubaSBkYXRlLXRpbWUgZGF0YSBjbGFzc2VzLg0KDQpgYGB7cn0NCiMgTG9hZCBwYWNrYWdlcyByZXF1aXJlZCBmb3IgZW50aXJlIHNjcmlwdA0KbGlicmFyeShsdWJyaWRhdGUpICAjd29yayB3aXRoIGRhdGVzDQoNCiMgc2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIGVuc3VyZSBSIGNhbiBmaW5kIHRoZSBmaWxlIHdlIHdpc2ggdG8gaW1wb3J0DQojIHNldHdkKCJ3b3JraW5nLWRpci1wYXRoLWhlcmUiKQ0KYGBgDQoNCioqSW1wb3J0IENTViBmaWxlKio6DQrEkMOgdSB0acOqbiBjaMO6bmcgdGEgaMOjeSBjw7luZyBpbXBvcnQgdGltZSBzZXJpZXMgZGF0YS4gQ2jDum5nIHRhIHPhu60gZOG7pW5nICpoZjAwMS0xMC0xNW1pbi1tLmNzdiogZmlsZSBjaOG7qWEgYXRtb3NwaGVyaWMgZGF0YSBmb3IgdGhlIE5FT04gSGFydmFyZCBGb3Jlc3QgdsahaSAxNS1taW51dGUgaW50ZXJ2YWxzLg0KDQpgYGB7cn0NCiMgTG9hZCBjc3YgZmlsZSBvZiAxNSBtaW4gbWV0ZW9yb2xvZ2ljYWwgZGF0YSBmcm9tIEhhcnZhcmQgRm9yZXN0DQojIEZhY3RvcnM9RkFMU0Ugc28gc3RyaW5ncywgc2VyaWVzIG9mIGxldHRlcnMvd29yZHMvbnVtZXJhbHMsIHJlbWFpbiBjaGFyYWN0ZXJzDQpoYXJNZXRfMTVNaW4gPC0gcmVhZC5jc3YoDQogIGZpbGU9Ik5FT04tRFMtTWV0LVRpbWUtU2VyaWVzL0hBUlYvRmlzaGVyVG93ZXItTWV0L2hmMDAxLTEwLTE1bWluLW0uY3N2IiwNCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KIyBWaWV3IGZpcnN0IDEwIHJvd3Mgb2YgZGF0YQ0KaGVhZChoYXJNZXRfMTVNaW4sIDEwKQ0KYGBgDQoNCioqc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSoqOiBLaGkgxJHhu41jIGZpbGVzIGNow7puZyB0cm9uZyBSIGNow7puZyB0YSBo4bqndSBo4bq/dCB0aMaw4budbmcgc+G7rSBk4bulbmcgKnN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSouIFRoaeG6v3QgbOG6rXAgbsOgeSDEkeG6o20gYuG6o28gcuG6sW5nIG5vbi1udW1lcmljIChzdHJpbmcpIGtow7RuZyDEkcaw4bujYyBjaHV54buDbiB24buBIGThuqFuZyBmYWN0b3JzLiANCg0KKipE4buvIGxp4buHdSBEYXRlIHbDoCBUaW1lKio6DQoNCkNow7puZyB0YSBow6N5IGPDuW5nIGtp4buDbSB0cmEgY2xhc3MgY+G7p2EgY+G7p2EgY+G7mXQgZGF0ZXRpbWUgdHJvbmcgYuG6o25nIGThu68gbGnhu4d1Og0KDQpgYGB7cn0NCiMgdmlldyBjb2x1bW4gZGF0YSBjbGFzcw0KY2xhc3MoaGFyTWV0XzE1TWluJGRhdGV0aW1lKQ0KDQojIyBbMV0gImNoYXJhY3RlciINCg0KIyB2aWV3IHNhbXBsZSBkYXRhDQpoZWFkKGhhck1ldF8xNU1pbiRkYXRldGltZSkNCmBgYA0KDQoNCkPhu5l0IGRhdGV0aW1lIHRyb25nIGLhuqNuZyBk4buvIGxp4buHdSBj4bunYSBjaMO6bmcgdGEgbMOgIGNoYXJhY3RlciBjbGFzcy4gVsOsIHbhuq15IGNow7puZyB0YSBj4bqnbiBiaeG6v24gxJHhu5VpIG7DsyB24buBIGRhdGUtdGltZSBjbGFzcy4gxJBp4buBdSBnw6wgc+G6vSB44bqjeSByYSBraGkgY2jDum5nIHRhIHPhu60gZOG7pW5nICoqYXMuRGF0ZSoqIG1ldGhvZD8NCg0KYGBge3J9DQojIGNvbnZlcnQgY29sdW1uIHRvIGRhdGUgY2xhc3MNCmRhdGVPbmx5X0hBUlYgPC0gYXMuRGF0ZShoYXJNZXRfMTVNaW4kZGF0ZXRpbWUpDQoNCiMgdmlldyBkYXRhDQpoZWFkKGRhdGVPbmx5X0hBUlYpDQoNCiMjIFsxXSAiMjAwNS0wMS0wMSIgIjIwMDUtMDEtMDEiICIyMDA1LTAxLTAxIiAiMjAwNS0wMS0wMSIgIjIwMDUtMDEtMDEiDQojIyBbNl0gIjIwMDUtMDEtMDEiDQpgYGANCg0KS2hpIHPhu60gZOG7pW5nICoqYXMuRGF0ZSoqIGNow7puZyB0YSBz4bq9IGLhu4sgbeG6pXQgKip0aW1lIHN0YW1wKiouDQoNCiMjIyBFeHBsb3JlIERhdGUgYW5kIFRpbWUgQ2xhc3Nlcw0KDQoqKlIgLSBEYXRlIENsYXNzIC0gYXMuRGF0ZSoqOg0KDQpDaMO6bmcgdGEgbeG7m2kgdGjhuqV5IHLhurFuZyAqKmFzLkRhdGUqKiBraMO0bmcgbMawdSBi4bqldCBr4buzIHRow7RuZyB0aW4gduG7gSB0aOG7nWkgZ2lhbiBuw6BvLiBLaGkgY2jDum5nIHRhIHPhu60gZOG7pW5nICoqYXMuRGF0ZSoqIG1ldGhvZCDEkeG7gyBiaeG6v24gxJHhu5VpIGRhdGUgZOG6oW5nIGNoYXJhY3RlciBjbGFzcyBz4bq9IMSRxrDhu6NjIGzGsHUgdsOoIGThuqFuZyBSIGRhdGUgY2xhc3MsIG7DsyBz4bq9IGLhu48gcXVhIHThuqV0IGPhuqMgY8OhYyB0aMO0bmcgdGluIHBow61hIHNhdSBkYXRlIHN0cmluZy4NCg0KYGBge3J9DQojIENvbnZlcnQgY2hhcmFjdGVyIGRhdGEgdG8gZGF0ZSAobm8gdGltZSkgDQpteURhdGUgPC0gYXMuRGF0ZSgiMjAxNS0xMC0xOSAxMDoxNSIpICAgDQpzdHIobXlEYXRlKQ0KDQojIyAgRGF0ZVsxOjFdLCBmb3JtYXQ6ICIyMDE1LTEwLTE5Ig0KDQojIHdoYXQgaGFwcGVucyBpZiB0aGUgZGF0ZSBoYXMgdGV4dCBhdCB0aGUgZW5kPw0KbXlEYXRlMiA8LSBhcy5EYXRlKCIyMDE1LTEwLTE5SGVsbG8iKSAgIA0Kc3RyKG15RGF0ZTIpDQoNCiMjICBEYXRlWzE6MV0sIGZvcm1hdDogIjIwMTUtMTAtMTkiDQpgYGANCg0KQ2jDum5nIHRhIGPDsyB0aOG7gyB0aOG6pXkgbMOgICoqYXMuRGF0ZSoqIGZ1bmN0aW9uIHPhur0gYmnhur9uIMSR4buVaSBjaGFyYWN0ZXJzIG3DoCDEkcaw4bujYyB4w6FjIMSR4buLbmggbMOgIHBhcnQgY+G7p2EgZGF0ZSB2w6ggZGF0ZSBjbGFzcyB2w6AgYuG7jyBxdWEgdOG6pXQgY+G6oyBjw6FjIGNoYXJhY3RlcnMga2jDoWMg4bufIGThuqFuZyBzdHJpbmcuDQoNCiMjIyBSIC0gRGF0ZS1UaW1lIC0gVGhlIFBPU0lYIGNsYXNzZXM6DQoNCg0KDQoNCg==