使用 matplotlib 绘制日期时间输出

Plotting datetime output using matplotlib

所以我的代码基于一个简单的数据数组,如下所示:

    5020 : 2015 7 11 11 42 54 782705
    5020 : 2015 7 11 11 44 55 575776
    5020 : 2015 7 11 11 46 56 560755
    5020 : 2015 7 11 11 48 57 104872

情节如下所示:

    import scipy as sp
    import matplotlib.pyplot as plt
    data = sp.genfromtxt("E:/Python/data.txt", delimiter=" : ")
    x = data[:,0]
    y = data[:,1]
    plt.scatter(x,y)
    plt.title("Instagram")
    plt.xlabel("Time")
    plt.ylabel("Followers")
    plt.xticks([w*2*60 for w in range(10)],
    ['2-minute interval %i'%w for w in range(10)])
    plt.autoscale(tight=True)
    plt.grid()
    plt.show()

我正在寻找一种简单的方法来将日期时间输出用作图表上的 x 间隔,我想不出一种方法让它理解它,就是这样:

    In [15]:sp.sum(sp.isnan(y))
    Out[15]: 77

我猜是因为空格?我是 Python 的机器学习新手,请原谅我的无知。

非常感谢。

是的,这是因为空格。当您导入数据时,它会将 NaN 分配给您的 x 值。

试试这个,它有点长,但应该有用:

data = []
x=[]
y=[]

with open('data.txt', 'r') as f:
    for line in f:
        data.append(line.split(':'))

for i in data:
y.append(i[0])
x_old.append(i[1])

for t in x_old:
    x.append(float(t[17:19]+'.'+t[20:])/60+int(t[14:16]))

由于空格,我不得不手动将数据转换为浮点数。我将秒+毫秒除以 60,然后加上分钟,因为我假设您只对此感兴趣(2 分钟间隔)。

如果格式做得更好,您可以使用 datetime 并更好地提取信息。例如:

my_time = datetime.strptime('2015 7 11 11 42 54.782705', '&Y &m %d %H:%M:%S.%f')

我会通过直接将 datetime.datetime 对象传递给 pyplot 来解决这个问题。这是一个简短的例子:

import datetime as dt
import matplotlib.pyplot as plt
import matplotlib

# Note: please figure out yourself the data input
x     = [dt.datetime(2015,7,11,11,42,54),
     dt.datetime(2015,7,11,11,44,56),
     dt.datetime(2015,7,11,11,46,56),
     dt.datetime(2015,7,11,11,48,57)]

#define the x limit:
xstart= dt.datetime(2015,7,11,11,40,54)
xstop = dt.datetime(2015,7,11,11,50,54)


y     = [782705, 575776, 560755, 104872]

fig,ax= plt.subplots()
ax.scatter(x,y)
xfmt = matplotlib.dates.DateFormatter('%D %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
ax.set_title("Instagram")
ax.set_xlabel("Time")
ax.set_ylabel("Followers")
ax.set_xlim(xstart,xstop)
plt.xticks(rotation='vertical')
plt.show()

结果: