尝试将月份编号转换为日期集中的月份名称

Posted

技术标签:

【中文标题】尝试将月份编号转换为日期集中的月份名称【英文标题】:Trying to convert month number to month name in a date set 【发布时间】:2021-08-08 15:18:38 【问题描述】:

当我尝试使用以下代码用月份名称替换月份编号时,我得到了 NA 值:

total_trips_v2$month <- ordered(total_trips_v2$month, levels=c("Jul","Aug","Sep","Oct", "Nov","Dec","Jan", "Feb", "Mar","Apr","May","Jun"))

我正在处理一个大数据集,其中月份列是 char 数据类型,月份编号为 '06'、'07' 等等,从 06 开始。

我什至不确定我使用的代码中的有序函数,它的真正作用。我在某处看到它并使用它。我试图查找代码以替换行中的特定值,但看起来很混乱。 谁能帮我解决这个问题?

【问题讨论】:

你能用dput(head(total_trips_v2$month, 20))的输出编辑问题吗? @ruibarradas 你能告诉我这到底会做什么吗?我只看到“07”打印了 20 次。 表示前20个月都是"07"。无论如何,你已经有了一个有效的答案,所以它不再重要了。请参阅我对答案的评论。 【参考方案1】:

使用数据类型有时会让人感到困惑,但它可以帮助您实现想要实现的目标。因此,请确保您了解如何在不同类型之间转换!

R 中内置了一些“帮助程序”来处理月份和月份的名称。

下面我们的数据框中有一个“字符”向量,即 df$month。 R 中的辅助向量是 month.name(完整月份名称)和 month.abb(缩写月份名称)。

您可以通过调用向量的第 n 个位置的元素来索引向量。 因此,month.abb[6] 将返回“Jun”。 我们使用它来强制月份为“数字”,然后用缩写名称重新编码。

# simulating some data
df <- data.frame(month = c("06","06","07","09","01","02"))

# test index month name
month.abb[6]

# check what happens to our column vector - for this we coerce the 06,07, etc. to numbers!
month.abb[as.numeric(df$month)]

# now assign the result
df$month_abb <- month.abb[as.numeric(df$month)]

这会产生:

df
  month month_abb
1    06       Jun
2    06       Jun
3    07       Jul
4    09       Sep
5    01       Jan
6    02       Feb

【讨论】:

@SarthakDev 当someone answers你的问题时该怎么办。 你可以回复他们的回答然后关闭问题:)【参考方案2】:

lubridate 包还可以帮助您提取日期时间对象的某些组件,例如月份编号或名称。

在这里,我做了一些示例日期:

tibble(
  date = c('2021-01-01', '2021-02-01', '2021-03-01')
) %>% 
  . ->> my_dates

my_dates

# # A tibble: 3 x 1
# date      
# <chr>     
# 2021-01-01
# 2021-02-01
# 2021-03-01

首先我们需要将这些字符格式的值转换为日期格式的值。我们使用lubridate::ymd() 来执行此操作:

my_dates %>% 
  mutate(
    date = ymd(date)
    ) %>% 
  . ->> my_dates_formatted

my_dates_formatted

# # A tibble: 3 x 1
# date      
# <date>    
# 2021-01-01
# 2021-02-01
# 2021-03-01

请注意,列名 (date) 下打印的格式已从 &lt;chr&gt; 更改为 &lt;date&gt;

现在日期是&lt;date&gt; 格式,我们可以使用lubridate::month() 提取不同的组件。详情请见?month

my_dates_formatted %>% 
  mutate(
    month_num = month(date), 
    month_name_abb = month(date, label = TRUE), 
    month_name_full = month(date, label = TRUE, abbr = FALSE)
  )

# # A tibble: 3 x 4
# date       month_num month_name_abb month_name_full
# <date>         <dbl> <ord>          <ord>          
# 2021-01-01         1 Jan            January        
# 2021-02-01         2 Feb            February       
# 2021-03-01         3 Mar            March 

请参阅my answer to your other question here,但在 R 中使用日期时,最好将它们保留为默认的 YYYY-MM-DD 格式。这通常使计算和操作更加直接。如上所示的月份名称可以很好地制作标签,例如在制作图形和标记数据点或轴时。

【讨论】:

以上是关于尝试将月份编号转换为日期集中的月份名称的主要内容,如果未能解决你的问题,请参考以下文章

月份名称到月份编号,反之亦然在python中

将 bigint 转换为日期(月份名称)

将一列日期数字转换为缩写月份

如何将日期时间转换为erlang中的日期名称和月份名称?

月份编号到月份名称

如何将包含月份名称的字符串数据和时间转换为 Java 中的 Date 对象?