50

我正在使用该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

这是我的数据框的示例

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

我不知道我做错了什么。

4

5 回答 5

68

?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

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

month(dmy(some_date))
[1] 2 4

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

month(some_date)
[1] 2 4

有关格式列表,请参阅?strptime。您会发现“标准明确格式”代表

默认格式遵循 ISO 8601 国际标准的规则,将一天表示为“2001-02-28”,将时间表示为“14:01:02”,此处使用前导零。

于 2014-03-24T08:13:02.727 回答
60

无需外部包:

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

myDate = as.POSIXct("2013-01-01")

然后获取月份编号:

format(myDate,"%m")

并获取月份字符串:

format(myDate,"%B")
于 2014-03-24T08:16:14.583 回答
16

您可以通过以下方式将其转换为日期格式 -

new_date <- as.Date(old_date, "%m/%d/%Y")

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"
于 2015-10-08T14:10:54.267 回答
2

她是另一种R base方法:

从您的示例中:某个日期:

Some_date<-"01/01/1979"

我们告诉 R,“那是一个日期”

Some_date<-as.Date(Some_date)

我们提取月份:

months(Some_date)

output: [1] "January"

最后,我们可以将其转换为数值变量:

as.numeric(as.factor(months(Some_date)))

outpt: [1] 1
于 2017-08-18T14:21:49.757 回答
0

一段时间以来,您还可以只依赖data.table包及其IDate类以及相关功能。(检查?as.IDate())。因此,无需额外安装lubridate.

require(data.table)

some_date <- c("01/02/1979", "03/04/1980")
month(as.IDate(some_date, '%d/%m/%Y')) # all data.table functions
于 2020-09-11T16:03:48.827 回答