将以下时间信息转换为pyplot可以识别的内容

时间:2018-08-12 16:51:01

标签: python pandas datetime matplotlib datetime-format

我有一个带有两列时间信息的DataFrame。第一个是以秒为单位的纪元时间,第二个是对应的格式化str时间,例如"2015-06-01T09:00:00+08:00",其中"+08:00"表示时区。

我知道时间格式在Python中是in a horrible mess,并且matplotlib.pyplot似乎只能识别datetime格式。我尝试了几种将str时间转换为datetime的方法,但是它们都不起作用。当我使用pd.to_datetime时,它将转换为datetime64,当使用pd.Timestamp时,它将转换为Timestamp,即使我尝试使用这两个函数的组合,输出也会始终为datetime64Timestamp,但永远不会一次datetime。我还尝试了this answer中建议的方法。没用现在有点把我撞倒了。

有人可以为此找到一个快速的方法吗?谢谢!

我在下面发布了一个最小示例:

import matplotlib.pyplot as plt
import time
import pandas as pd
df = pd.DataFrame([[1433120400, "2015-06-01T09:00:00+08:00"]], columns=["epoch", "strtime"])

# didn't work
df["usable_time"] = pd.to_datetime(df["strtime"])  

# didn't work either
df["usable_time"] = pd.to_datetime(df["strtime"].apply(lambda s: pd.Timestamp(s)))  

# produced a strange type called "struct_time". Don't think it'd be compatible with pyplot
df["usable_time"] = df["epoch"].apply(lambda x: time.localtime(x))  

# attempted to plot with pyplot
df["usable_time"] = pd.to_datetime(df["strtime"])
plt.plot(x=df["usable_time"], y=[0.123])
plt.show()

2 个答案:

答案 0 :(得分:2)

更新(按评论)
似乎这里的混乱源于对plt.plot()的调用采用位置x / y参数而不是关键字参数的事实。换句话说,the appropriate signature是:

plt.plot(x, y)

或者,或者:

plt.plot('x_label', 'y_label', data=obj) 

但不是:

plt.plot(x=x, y=y)

关于为何存在Pyplot的这种古怪here有单独的讨论,另请参见下面的ImportanceOfBeingErnest的评论。

原始
这并不是真正的答案,更多的是证明Pyplot与Pandas日期时间数据没有关系。我在df上增加了一行,以使图更清晰:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame([[1433120400, "2015-06-01T09:00:00+08:00"],
                   [1433130400, "2015-07-01T09:00:00+08:00"]], 
                  columns=["epoch", "strtime"])

df["usable_time"] = pd.to_datetime(df["strtime"])  

df.dtypes
epoch                   int64
strtime                object
usable_time    datetime64[ns]
dtype: object

plt.plot(df.usable_time, df.epoch)

plot

pd.__version__ # '0.23.3'
matplotlib.__version__ # '2.2.2'

答案 1 :(得分:1)

如果您确实想要的话,可以使用to_pydatetime(从dt accessorTimestamp)获取本机日期时间对象,例如:

pd.to_datetime(df["strtime"]).dt.to_pydatetime()

这将返回本地日期时间对象数组:

array([datetime.datetime(2015, 6, 1, 1, 0)], dtype=object)

但是,pyplot似乎可以与pandas datetime系列配合使用。