【发布时间】:2019-07-24 20:00:23
【问题描述】:
我正在尝试 plot 来自 pandas df 的一系列值。这些值取自Columns,它显示了在任何时间点出现的值的总数。
我的尝试如下。我遇到的问题是x-axis 的格式不正确,因为值超过了午夜。与午夜之后的时间戳相关的值是plotted first 而不是 last。 (请看下图)
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata
d = ({
'Time1' : ['8:00:00','10:30:00','12:40:00','16:25:00','22:30:00','1:31:00','2:15:00','2:20:00','2:30:00'],
'Occurring1' : ['1','2','3','4','5','4','3','2','1'],
'Time2' : ['8:10:00','10:10:00','13:40:00','16:05:00','21:30:00','1:11:00','3:00:00','3:01:00','6:00:00'],
'Occurring2' : ['1','2','3','4','5','4','3','2','0'],
'Time3' : ['8:05:00','11:30:00','15:40:00','17:25:00','23:30:00','1:01:00','6:00:00','6:00:00','6:00:00'],
'Occurring3' : ['1','2','2','3','2','1','0','0','0'],
'Time4' : ['9:50:00','10:30:00','14:40:00','18:25:00','20:30:00','0:31:00','2:35:00','6:00:00','6:00:00'],
'Occurring4' : ['1','2','3','4','4','3','2','0','0'],
'Time5' : ['9:00:00','11:30:00','13:40:00','17:25:00','00:30:00','2:31:00','6:00:00','6:00:00','6:00:00'],
'Occurring5' : ['1','2','3','3','2','1','0','0','0'],
})
df = pd.DataFrame(data=d)
df = df.astype({
"Time1": np.datetime64,
"Occurring1": np.int,
"Time2": np.datetime64,
"Occurring2": np.int,
"Time3": np.datetime64,
"Occurring3": np.int,
"Time4": np.datetime64,
"Occurring4": np.int,
"Time5": np.datetime64,
"Occurring5": np.int,
})
all_times = df[["Time1", "Time2", "Time3",'Time4','Time5']].values
t_min = np.timedelta64(int(60*1e9), "ns")
time_grid = np.arange(all_times.min(), all_times.max(), 10*t_min, dtype="datetime64")
X = pd.Series(time_grid).dt.time.values
occurrences_grid = np.zeros((5, len(time_grid)))
for i in range(5):
occurrences_grid[i] = griddata(
points=df["Time%i" % (i+1)].values.astype("float"),
values=df["Occurring%i" % (i+1)],
xi=time_grid.astype("float"),
method="linear"
)
occ_min = np.min(occurrences_grid, axis=0)
occ_max = np.max(occurrences_grid, axis=0)
occ_mean = np.mean(occurrences_grid, axis=0)
plt.style.use('ggplot')
plt.fill_between(X, occ_min, occ_max, color="blue")
plt.plot(X, occ_mean, c="white")
plt.tight_layout()
plt.show()
输出:
【问题讨论】:
-
如果这些时间表示两个不同日子的时刻,他们应该随身携带一个日期。
-
@ImportanceOfBeingErnest,我只想
plottimestamps。没有date有可能吗? -
那么如果您不指定各个时间的日期,您如何想象轴知道
02:00应该在10:30之后?这就是我已经表达的第一条评论,所以我猜你想实现它,然后可能会询问你在这样做时遇到的任何问题。 -
我不期望它知道。我正在考虑用日期时间绘制它,以便正确格式化轴,然后考虑使用 xticks。你认为反对票真的有必要吗?
-
我没有投反对票,所以我无法对此发表评论。但我的直觉是,如果你应用第一条评论并在问题中说明为什么这没有帮助,人们会更好地理解问题的要求,因此不会投反对票。
标签: python pandas datetime matplotlib plot