Python 将字符(或对象)变量转换为数字(或日期时间)变量
我有一份关于销售量的月度数据:Python 将字符(或对象)变量转换为数字(或日期时间)变量,python,r,datetime,ggplot2,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
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和@Thomaspperz的答案,以下代码给出了我想要的:
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))
尝试:
使用“lubridate”转换为日期对象,然后使用month()仅提取月份并将其存储为新变量
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")
添加
group=1
,ggplot(df,aes(x=YearMonth,y=salecount,group=1))+geom_line()
如果你在谷歌上搜索错误消息,它会引导你找到标记的帖子。对我来说,它会显示你在x轴YearMonth
列中的内容,这是2010-04
,2010-05
。你需要什么?@RonakShah,非常感谢你的快速回复!group=1实际上只适用于少数几点。我的问题是我有太多的观测,而x轴的所有值都相互重叠。。。我知道如果x值存储为datetime,我们可以添加一个日期或时间分隔符。但由于在这里它是以字符的形式存储的,我们仍然可以每隔几个月显示一次,而不是在x轴上显示所有的月份吗?我们可以聚合数据,然后进行绘图。您能否再发布几行有重叠日期的内容,并解释您希望输出的内容。我会重新打开这篇文章。哦,很抱歉造成混乱,我所说的重叠是指轴上有太多标签,所以我看不到哪个月对应哪些数据,就像在这篇文章中:但是那篇文章中的方法对我不起作用,因为我的数据是字符…非常感谢你的建议!这很有道理,但有两个问题:(1)润滑油在这里工作很奇怪。。。它将2004-06转换为2020-04-06,我收到一条错误消息:警告消息:72解析失败。(2) 第二行只给出了月份,例如,它给出了6,而不是2014-06,这是我需要放在x轴上的。原因是,还有来自2015-06、2017-06等的数据。如果我只提取月份,我无法区分年份……如果你的数据是“2010-04”格式的,它应该能够解析。确保您的数据与最初发布的数据相同,而不是“YYYY-MM-DD”。如果需要,请尝试侧向旋转x轴标签以腾出更多空间ggplot(…)+…+主题(axis.text.x=element_text(angle=60,hjust=1))
另外,lubridate::months(df,format=“”,labels=TRUE)
将生成缩写的月份标签。这对我很有帮助,我一直在寻找一种方法来将x轴标签转换成一个角度。非常感谢你!!关于缩写,我收到一条错误消息。。。错误:“months”不是从“namespace:lubridate”导出的对象,非常感谢!!这对我来说非常有效-在我将_中断日期改为6个月后,x轴现在非常清晰。请问,(1)ymd函数中的“粘贴”是做什么的,(2)日期标签中的“%b”是什么意思?非常感谢你的耐心paste
是一个连接字符串的基本R函数;lubridate的ymd
功能预计是一年,然后是一个月,然后是一天。R有多种日期格式代码,例如%y是YY,%y是YYYY.%b恰巧是缩写月份:非常感谢您的详细解释和参考,@Jon Spring!这确实解决了我的问题,并教会了我如何解决它。抱歉,还有一个问题-我正在学习r,正在阅读关于粘贴的文档:粘贴(…,sep=“”,collapse=NULL)。它说第二个论点是我们想要如何分离数据。您的代码中的1
是否意味着我们不需要分离数据?否,1将在之后粘贴,默认为sep
a空格,以便将“2010-04”转换为“2010-04 1”。Lubridate非常健壮,将空格、破折号、斜线等视为术语之间的分隔符,因此它应该始终将其转换为正确的日期。哦,这很有意义!非常感谢你的详细解释,乔恩·斯普林!
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")