将字符(或对象)变量转换为数字(或日期时间)变量

时间:2019-03-20 02:01:28

标签: python r datetime ggplot2

我有每月销售量数据:

YearMonth     Sales Count
2010-04       300
2010-05       342
2010-06       425

我只想在r中绘制线形图以观察趋势。

我在r中使用ggplot2:

ggplot(data,
   aes(x = YearMonth, y = `Sales Count`)) +
   geom_line()

但是,r给我一个错误消息:

geom_path: Each group consists of only one observation. 
Do you need to adjust the group aesthetic?

我尝试了多种方法将变量“ YearMonth”转换为数字变量,但它们都不起作用...

由于数据是在python中生成的,因此我使用以下命令检查了数据类型:

data.dtypes

它返回

YearMonth           object
Sales Count         int64
dtype: object

我尝试使用

进行转换
data['YearMonth'] = pd.to_datetime(data['YearMonth'])

但是它将所有内容转换为一个月的第一天,即现在的数据如下:

YearMonth        Sales Count
2010-04-01       300
2010-05-01       342
2010-06-01       425

因为x轴应该是每个月而不是每个月的第一天,所以是否可以只保留月份并将其绘制为数字或日期时间变量?

非常感谢!

编辑

实际上,当我在r上作图时,它只在x轴上显示2010、2011等年份。因此,如果我们可以更改x轴上显示的内容,则上述问题无关紧要。有没有一种方法可以定义在x轴上可以显示的内容,例如显示2010年4月,2010年5月,而不仅仅是年份?

解决方案

结合@Jon Spring和@ThomasPepperz的答案,以下代码可以准确地满足我的需求:

data[['YearMonth']] = lubridate::ymd(paste(data[['YearMonth']], 1))

ggplot(stats8, aes(YearMonth, `Sales Count`)) + 
  geom_line() +
  scale_x_date(date_breaks = "6 months",
               date_labels = "%Y %b") +
  theme(axis.text.x = element_text(angle=90, hjust=1))

2 个答案:

答案 0 :(得分:1)

data$date = lubridate::ymd(paste(data$YearMonth, 1))

library(ggplot2)
ggplot(data, aes(date, Sales_Count)) + 
  geom_line() +
  scale_x_date(date_breaks = "month",
               date_labels = "%Y %b")

enter image description here

答案 1 :(得分:0)

尝试:

df$YearMonth = lubridate::as_date(as.character(df$YearMonth), '%Y-%m')
df$month = lubridate::month(df$YearMonth)

使用'lubridate'转换为日期对象,然后使用month()仅提取月份并将其存储为新变量。