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

Python 将以下时间信息转换为pyplot可以识别的内容,python,pandas,datetime,matplotlib,datetime-format,Python,Pandas,Datetime,Matplotlib,Datetime Format,我有一个包含两列时间信息的数据帧。第一个是以秒为单位的历元时间,第二个是相应的格式化str时间,如“2015-06-01T09:00:00+08:00”,其中“+08:00”表示时区 我知道时间格式是Python格式的,matplotlib.pyplot似乎只识别datetime格式。我尝试了几种方法将str-time转换为datetime,但都不起作用。当我使用pd.to_datetime时,它将转换为datetime64,当使用pd.Timestamp时,它将转换为Timestamp,甚至当

我有一个包含两列时间信息的数据帧。第一个是以秒为单位的历元时间,第二个是相应的格式化str时间,如
“2015-06-01T09:00:00+08:00”
,其中
“+08:00”
表示时区

我知道时间格式是Python格式的,
matplotlib.pyplot
似乎只识别
datetime
格式。我尝试了几种方法将str-time转换为
datetime
,但都不起作用。当我使用
pd.to_datetime
时,它将转换为
datetime64
,当使用
pd.Timestamp
时,它将转换为
Timestamp
,甚至当我尝试使用这两个函数的组合时,输出将始终是
datetime 64
Timestamp
,但决不会是一次
datetime
。我还尝试了中建议的方法。没用。这让我有点发疯了

有人能想出一个快速的方法吗?谢谢

我在下面举了一个简单的例子:

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

如果确实需要,可以使用
来_pydatetime
(从或)获取本机日期时间对象,例如:

pd.to_datetime(df["strtime"]).dt.to_pydatetime()
这将返回本机datetime对象的数组:

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

但是,pyplot似乎能够处理pandas datetime系列。

如果确实需要,您可以使用
从or获取本机datetime对象,例如:

pd.to_datetime(df["strtime"]).dt.to_pydatetime()
这将返回本机datetime对象的数组:

array([datetime.datetime(2015, 6, 1, 1, 0)], dtype=object)
然而,pyplot似乎能够处理pandas datetime系列。

更新(根据评论)
这里的混淆似乎源于这样一个事实,即对
plt.plot()
的调用采用位置
x
/
y
参数,而不是关键字参数。换言之,是:

或者,或者:

plt.plot('x_label', 'y_label', data=obj) 
但不是:

plt.plot(x=x, y=y)
关于Pyplot的这种怪癖为何存在,还有一个单独的讨论,另请参见下面的ImportanceOfBeingErnest的评论

原创
这并不是一个真正的答案,更多的是证明Pyplot与datetime数据没有问题。我在
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)

更新(根据评论)
这里的混淆似乎源于这样一个事实,即对
plt.plot()
的调用采用位置
x
/
y
参数,而不是关键字参数。换言之,是:

或者,或者:

plt.plot('x_label', 'y_label', data=obj) 
但不是:

plt.plot(x=x, y=y)
关于Pyplot的这种怪癖为何存在,还有一个单独的讨论,另请参见下面的ImportanceOfBeingErnest的评论

原创
这并不是一个真正的答案,更多的是证明Pyplot与datetime数据没有问题。我在
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)



你能解释一下为什么不使用
df[“可用时间”]=pd.to\u datetime(df[“strtime”])
?@jezrael用这种方式它会转换成
时间戳
,而pyplot似乎不理解这种格式。好的,你能添加你的绘图代码吗?pyplot可以毫无问题地读取pandates
time64
格式。如果你做了
plt.plot(df.available\u time,df.epoch)
一个图形将被无误地呈现出来。(您可以添加一个或两个额外的点来验证是否绘制了一条线。)@jezrael Yes。我已经添加了绘图部分。您能解释一下为什么不使用
df[“可用时间”]=pd.to\u datetime(df[“strtime”])
?@jezrael以这种方式将转换为
时间戳
,pyplot似乎不理解这种格式。好的,您可以添加绘图代码吗?Pyplot可以毫无问题地读取Pandas
datetime64
格式。如果你做了
plt.plot(df.available\u time,df.epoch)
一个图形将被无误地呈现出来。(您可以添加一个或两个额外的点来验证是否绘制了一条线。)@jezrael Yes。我已经添加了绘图部分.Hmmm,如果使用
print(df.dtypes)
的测试样本数据与
df[“可用时间”]=pd.to\u datetime(df[“strtime”])
Right,pandas足够聪明,可以正确获得数据类型。Hmmm,如果使用
print(df.dtypes)
的测试样本数据与
df[“可用时间”]=pd.to\u datetime(df)相同[“strtime”]
没错,pandas足够聪明,可以正确地获取数据类型。这可能只是因为OP正在使用
plt.plot(x=…,y=…)
而您正在使用
plt.plot(…,…)
@ImportanceOfBeingErnest是的,这似乎是问题所在。我不知道它们是不同的!谢谢。@ImportanceOfBeingErnest你会发布一个解释差异的答案吗?(或者已经存在了?)@重要的是,但我仍然不明白它们为什么不同……绘图的第一个和第二个参数只是x和y。你介意指出吗?可能这样的答案已经存在,但很难找到,因为这些问题隐藏在完全不同的问题后面,正如在本例中所看到的。的签名
plot
是,
x
y
因此没有命名或关键字参数,因此不能(错误地)使用它们。也许可以将这些信息添加到答案中?可能只是OP正在使用
plt.plot(x=…,y=…)
而您正在使用
plt.plot(…,…)
@ImportanceOfBeingErnest是的,这似乎是问题所在。我不知道它们是不同的!谢谢。@ImportanceOfBeingErnest你会发布一个解释差异的答案吗?(或者已经存在了?)@重要的是,但我仍然不明白它们为什么不同……绘图的第一个和第二个参数只是x和y。你介意指出吗?可能这样的答案已经存在,但很难找到,因为这些问题隐藏在完全不同的问题后面,正如在本例中所看到的。的签名
绘图