如何将日期时间转换为数字数据类型?
Posted
技术标签:
【中文标题】如何将日期时间转换为数字数据类型?【英文标题】:how to convert datetime to numeric data type? 【发布时间】:2018-12-23 17:05:36 【问题描述】:我有一个数据集
time MachineId
1530677359000000000 01081081
1530677363000000000 01081081
1530681023000000000 01081090
1530681053000000000 01081090
1530681531000000000 01081090
所以我的代码是这样的:
import pandas as pd
from datetime import datetime
import time
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
df= pd.read_csv('acn.csv')`
df['time']=pd.to_datetime(df['time'], unit='ns')` #converting the epoch nanosec time to datetime-format
print(df.head())
输出:
time MachineId
0 2018-07-04 04:09:19 1081081.0
1 2018-07-04 04:09:23 1081081.0
2 2018-07-04 05:10:23 1081090.0
3 2018-07-04 05:10:53 1081090.0
4 2018-07-04 05:18:51 1081090.0
现在我想将我的时间数据更改为数字以生成时间和机器 ID 之间的图
dates = plt.dates.date2num(df['time'])
df.plot(kind='scatter',x='dates',y='MachineId')
plt.show()
抛出错误:
AttributeError: 'module' 对象没有属性 'dates'
如何将datetime
格式更改为numeric
以便形成绘图?
【问题讨论】:
我对您的问题进行了编辑以澄清措辞。此编辑正在等待同行评审。我认为您问题中的前两个大块(原始 df 和调用 pd.to_datetime 的 pandas 代码)与您的问题完全不相关,可能也应该删除,但我暂时将它们留在了。 @surya-rahul 你可能对this chart 感兴趣。为什么要第二次转换它而不是使用您的日期时间列plt.plot(df.time, df.MachineId, "ro")
?
一般来说,混合使用 pandas 和 matplotlib 日期时间对象是个坏主意:***.com/a/44214830/8881141
@Mr.T plt.plot(df.time, df.MachineId, "ro")
给出了散点图,但这里的参数“ro”是什么?在这种情况下如何在这里获取其他图,即直方图,箱线图??
@suryarahul plt.plot 的文档:(matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html)解释了文本字符串(在本例中为“ro”)控制标记的颜色和样式。 matplotlib 文档还将告诉您如何制作箱线图。但是,这仍然无法解决 AttributeError,我的回答解释了它的原因和解决方案,所以请接受它。
【参考方案1】:
您收到以下错误:
AttributeError: 'module' 对象没有属性 'dates'
您的错误消息告诉您matplotlib.pyplot.dates
(plt.dates
) 不存在。 (错误表明有一个模块,您正在调用“日期”,但它不存在)。
因此,您需要先修复该错误,然后再担心转换任何内容。你的意思是打电话给matplotlib.dates.date2num
吗?在您的代码中,您有以下内容:
将 matplotlib.dates 导入为 mdate
所以也许你打算打电话给mdate.date2num
?那应该消除AttributeError
。
如果这对您不起作用,您可以尝试其他评论者之一提供的 link 中的建议,以使用 pandas to_pydatetime
。我不熟悉它,但是在这个example page 中,它是作为Series.dt.to_pydatetime() 访问的
所有这些转换都是必要的,因为您正在尝试使用df.plot
;也许你应该考虑直接调用 matplotlib 。例如,您可以只使用plt.plot_date
吗? (here's 链接)。 Pandas 非常出色,但绘图界面不如其他界面成熟。举个例子(我并不是说这是您遇到的确切问题),而是here is pandas 中关于绘制日期的一个已知错误。 Here 是一个较旧的堆栈溢出线程,有人为您存根 plt.plot_date 方法。
【讨论】:
这是答案还是问题? 我认为这就是答案。原始问题询问如何将datetime
转换为numeric
,但如果不修复属性错误的来源,该代码是无关紧要的。一旦解决了这个问题,我认为不需要转换。
对我来说,这看起来像是一条要求澄清的评论。
我正在提供一个可行的替代方案,完全按照“”“”的建议,具体来说,问题是什么?确保你的答案提供了 - 或者一个可行的替代方案。答案可以是“不要那样做”,但它也应该包括“试试这个”。任何让提问者朝着正确方向前进的答案都是有帮助的,但请尝试在你的答案中提及任何限制、假设或简化。“”“从这里:meta.stackexchange.com/help/how-to-answer
实际上,当我在 x 轴上分配“时间”列时,日期时间格式没有得到绘图,它要求时间列采用数字格式,所以我使用 dates = plt.dates.date2num(df['time'])
将日期时间格式更改为数字,但我收到错误 AttributeError: 'module' object has no attribute 'dates'
@JeffEllen【参考方案2】:
您也可以直接绘制日期。例如,如果您想在 x 轴上显示日期,则将日期传递到 ax.plot(df.time, ids)
。我认为这可能是最接近您所寻找的东西。
【讨论】:
问题的哪一点?df.time
经历了多次转换。
显然是在最后修改之后!这段代码:dates = plt.dates.date2num(df['time'])
也是错误的,因为您需要 plt.time 而不是 plt.dates,因为那是列的名称。还有一个建议是因为我做了类似的事情,所以我会放弃一天中的时间并保留日期。然后根据日期绘制 machine_id。
将dates = plt.dates.date2num(df['time'])
更改为dates = plt.time.date2num(df['time'])
给出错误'module' object has no attribute 'date2num'
你也可以参考这个:[***.com/questions/27993540/…希望对你有帮助。以上是关于如何将日期时间转换为数字数据类型?的主要内容,如果未能解决你的问题,请参考以下文章