如何从R中提取月份

app*_*s92 24 r lubridate

我正在使用该lubridate软件包并应用该month函数从日期中提取月份.我在日期字段上运行了str命令,我得到了

Factor w/ 9498 levels "01/01/1979","01/01/1980",..: 5305 1 1 1 1 1 1 1 1 1 ...

> v1$Date<-month(v1$Date)
Error in as.POSIXlt.character(as.character(x), ...) : 
character string is not in a standard unambiguous format
Run Code Online (Sandbox Code Playgroud)

这是我的数据框的一个例子

https://drive.google.com/file/d/0B6cqWmwsEk20Q2dHblhXZi14Wk0/edit?usp=sharing

我不知道我做错了什么.

ton*_*nov 43

?month 状态:

日期时间必须是POSIXct,POSIXlt,Date,Period,chron,yearmon,yearqtr,zoo,zooreg,timeDate,xts,its,ti,jul,timeSeries和fts对象.

你的对象是一个因素,甚至不是一个字符向量(大概是因为stringsAsFactors = TRUE).您必须将矢量转换为某个日期时间类,例如POSIXlt:

library(lubridate)
some_date <- c("01/02/1979", "03/04/1980")
month(as.POSIXlt(some_date, format="%d/%m/%Y"))
[1] 2 4
Run Code Online (Sandbox Code Playgroud)

还有一个便利功能dmy,可以做同样的事情(由@Henrik提出的提示):

month(dmy(some_date))
[1] 2 4
Run Code Online (Sandbox Code Playgroud)

更进一步,@ IShouldBuyABoat给出了另一个提示,即接受dd/mm/yyyy字符格式而不进行任何显式转换:

month(some_date)
[1] 2 4
Run Code Online (Sandbox Code Playgroud)

有关格式列表,请参阅?strptime.你会发现"标准的明确格式"代表

默认格式遵循ISO 8601国际标准的规则,该规则将日期表示为"2001-02-28",将时间表示为"14:01:02",使用前导零作为此处.

  • `lubridate :: month`实际上并不需要输入是这些类中的任何一个,并且它将正确读取dd/mm/yyyy格式,甚至没有格式字符串. (4认同)
  • 鉴于问题是关于`lubridate`,你可以添加`dmy(some_date)`来代替`as.POSIXlt(some_date,format ="%d /%m /%Y")` (2认同)

Roc*_*nce 31

无需外部包装:

如果您的日期采用以下格式:

myDate = as.POSIXct("2013-01-01")
Run Code Online (Sandbox Code Playgroud)

然后获取月份数:

format(myDate,"%m")
Run Code Online (Sandbox Code Playgroud)

并获得月份字符串:

format(myDate,"%B")
Run Code Online (Sandbox Code Playgroud)


小智 12

你可以把它转换成日期格式 -

new_date<- as.Date(old_date, "%m/%d/%Y")} 
Run Code Online (Sandbox Code Playgroud)

new_date,你可以得到一个月strftime()

month<- strftime(new_date, "%m")

old_date<- "01/01/1979"
new_date<- as.Date(old_date, "%m/%d/%Y")
new_date
#[1] "1979-01-01"
month<- strftime(new_date,"%m")
month
#[1] "01"
year<- strftime(new_date, "%Y")
year
#[1] "1979"
Run Code Online (Sandbox Code Playgroud)