我有一个带有两列时间信息的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
,即使我尝试使用这两个函数的组合,输出也会始终为datetime64
或Timestamp
,但永远不会一次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()
答案 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)
pd.__version__ # '0.23.3'
matplotlib.__version__ # '2.2.2'
答案 1 :(得分:1)
如果您确实想要的话,可以使用to_pydatetime
(从dt
accessor或Timestamp
)获取本机日期时间对象,例如:
pd.to_datetime(df["strtime"]).dt.to_pydatetime()
这将返回本地日期时间对象数组:
array([datetime.datetime(2015, 6, 1, 1, 0)], dtype=object)
但是,pyplot似乎可以与pandas datetime系列配合使用。