Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符(或对象)变量转换为数字(或日期时间)变量_Python_R_Datetime_Ggplot2 - Fatal编程技术网

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")