แยกเดือนและปีจากสวนสัตว์ :: yearmon object


112

ฉันมีyearmonวัตถุ:

require(zoo)
date1 <- as.yearmon("Mar 2012", "%b %Y")
class(date1)
# [1] "yearmon"

ฉันจะแยกเดือนและปีออกจากสิ่งนี้ได้อย่างไร?

month1 <- fn(date1)
year1 <- fn(date1)

ฉันควรใช้ฟังก์ชันใดแทน fn()

คำตอบ:


144

ใช้วิธีการสำหรับวัตถุของคลาสformat() "yearmon"นี่คือวันที่ตัวอย่างของคุณ (สร้างอย่างถูกต้อง!)

date1 <- as.yearmon("Mar 2012", "%b %Y")

จากนั้นเราสามารถแยกส่วนวันที่ได้ตามต้องการ:

> format(date1, "%b") ## Month, char, abbreviated
[1] "Mar"
> format(date1, "%Y") ## Year with century
[1] "2012"
> format(date1, "%m") ## numeric month
[1] "03"

สิ่งเหล่านี้จะถูกส่งกลับเป็นอักขระ ในกรณีที่เหมาะสมให้รวมไว้ในas.numeric()กรณีที่คุณต้องการให้ปีหรือเดือนตัวเลขเป็นตัวแปรตัวเลขเช่น

> as.numeric(format(date1, "%m"))
[1] 3
> as.numeric(format(date1, "%Y"))
[1] 2012

ดู?yearmonและ?strftimeรายละเอียด - ส่วนหลังจะอธิบายอักขระตัวยึดที่คุณสามารถใช้ได้


4
% B สำหรับทั้งเดือนคือมีนาคม "แทน" ของ "Mar"
PatrickT

ฉันจะทำว่าถ้ามีvectorของ n องค์ประกอบให้พูด 1k วันในหนึ่งvector?
Stophface

@Chrissl เหมือน R มากdate1สามารถเป็นเวกเตอร์ของวันที่ได้เช่นกัน
Gavin Simpson

101

แพคเกจ lubridateเป็นที่น่าตื่นตาตื่นใจสำหรับชนิดของสิ่งนี้:

> require(lubridate)
> month(date1)
[1] 3
> year(date1)
[1] 2012

2
ฮ่าขอบคุณสำหรับคำตอบนี้ โดยเฉพาะอย่างยิ่งเอาชนะโซลูชันอื่น ๆ เมื่อคุณต้องการทำบางสิ่งเช่น if (year (date1)> 2014) {year (date1) <- year (date1) - 100}
Vincent

1
นี่เป็นคำตอบที่ดีที่สุดสำหรับความต้องการของฉันในการเอาชิ้นส่วนปีออกจากวันเริ่มต้นของสัญญา 4000 รายการ
d8aninja

@Ari B. Friedman ฉันกำลังใช้ R 3.1.0 ในขณะนี้ไม่สนับสนุนlubridateแพ็คเกจและพยายามติดตั้งสิ่งนี้และปีที่ใช้ (วันที่) แต่ให้วันแทนที่จะเป็นปีจะใช้ได้เฉพาะในวันที่ที่มีรูปแบบ "2015-05 -06 "?
KRU

1
@KRU R เวอร์ชันใหม่บางครั้งใช้เวลาสองสามสัปดาห์ในการอัปเดตแพ็กเกจทั้งหมด ควรใช้งานได้กับรูปแบบวันที่ทั้งหมดตราบใดที่เป็นรูปแบบวันที่จริงไม่ใช่เวกเตอร์อักขระ โปรดโพสต์คำถามใหม่หากยังไม่สามารถแก้ปัญหาของคุณได้และคุณไม่สามารถค้นหา SO สำหรับส่วนประกอบใด ๆ ของคำถามของคุณ
Ari B. Friedman

15

ฉันรู้ว่า OP ใช้zooที่นี่ แต่ฉันพบว่าเธรดนี้ googling สำหรับtsวิธีแก้ปัญหามาตรฐานสำหรับปัญหาเดียวกัน ฉันก็เลยคิดว่าจะเพิ่มzooคำตอบฟรีtsด้วย

# create an example Date 
date_1 <- as.Date("1990-01-01")
# extract year
as.numeric(format(date_1, "%Y"))
# extract month
as.numeric(format(date_1, "%m"))

12

คุณสามารถใช้format:

library(zoo)
x <- as.yearmon(Sys.time())
format(x,"%b")
[1] "Mar"
format(x,"%Y")
[1] "2012"

เอาเดือนมาเป็นตัวเลขได้ยังไง? (เช่น 3 มีนาคม?)
ดัม 888

@ user1169210 ฉันพูดถึงคำตอบนี้ คุณต้องการas.numeric(format(x, "%m"))ให้เดือนเป็นตัวเลขเช่น
Gavin Simpson

5

สำหรับเวกเตอร์ขนาดใหญ่:

y = as.POSIXlt(date1)$year + 1900    # x$year : years since 1900
m = as.POSIXlt(date1)$mon + 1        # x$mon : 0–11

1
นี่เป็นคำตอบที่ดีที่สุดเนื่องจาก R ได้จัดหาPOSIXltวัตถุที่มีประโยชน์ซึ่งทำให้ไม่จำเป็นต้องมีแพ็คเกจสวนสัตว์
Marco Demaio

0

คำถามไม่ได้ระบุอย่างชัดเจนว่าผลลัพธ์ที่คาดหวังไว้คืออะไร แต่สมมติว่าสำหรับเดือนที่คุณต้องการหมายเลขเดือน (มกราคม = 1) และสำหรับปีที่คุณต้องการตัวเลข 4 หลักปีจากนั้นสมมติว่าเราเพิ่งรันโค้ดในคำถาม:

cycle(date1)
## [1] 3
as.integer(date1)
## [1] 2012

0

มีปัญหาคล้ายกันกับข้อมูลตั้งแต่ปี 1800 ถึงตอนนี้สิ่งนี้ใช้ได้กับฉัน:

data2$date=as.character(data2$date) 
lct <- Sys.getlocale("LC_TIME"); 
Sys.setlocale("LC_TIME","C")
data2$date<- as.Date(data2$date, format = "%Y %m %d") # and it works
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.