如何将日期时间转换为数字数据类型?

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/…希望对你有帮助。

以上是关于如何将日期时间转换为数字数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

SQL-将BIGINT(20)转换为日期时间数据类型

oracle怎么把数值型日期转换成日期字符型

powerbi数字为啥转不了日期

sql中如何将datetime日期转换成int日期

如何将 Pandas 数据框中的字符串转换为“日期”数据类型?

如何从字符串转换为日期数据类型?