【问题标题】:python pandas plot with uneven timeseries index (with count evenly distributed)具有不均匀时间序列索引的python pandas plot(计数均匀分布)
【发布时间】:2014-03-07 18:42:21
【问题描述】:

我的数据框的时间索引不均匀。

我怎样才能找到一种方法来绘制数据并自动本地化索引?我在这里搜索,我知道我可以绘制类似

e.plot()

但时间索引(x 轴)将是偶数间隔,例如每 5 分钟。 如果前 5 分钟需要 100 个数据,后 5 分钟需要 6 个数据,我该如何绘制 数据数量均匀。并在 x 轴上找到正确的时间戳。

这里是偶数,但我不知道如何添加时间索引。

plot(e['Bid'].values)

请求的数据格式示例

时间,出价

2014-03-05 21:56:05:924300,1.37275

2014-03-05 21:56:05:924351,1.37272

2014-03-05 21:56:06:421906,1.37275

2014-03-05 21:56:06:421950,1.37272

2014-03-05 21:56:06:920539,1.37275

2014-03-05 21:56:06:920580,1.37272

2014-03-05 21:56:09:071981,1.37275

2014-03-05 21:56:09:072019,1.37272

这是链接 http://code.google.com/p/eu-ats/source/browse/trunk/data/new/eur-fix.csv

这是代码,我曾经绘制过

import numpy as np
import pandas as pd
import datetime as dt
e = pd.read_csv("data/ecb/eur.csv", dtype={'Time':object})
e.Time = pd.to_datetime(e.Time, format='%Y-%m-%d %H:%M:%S:%f')
e.plot()

f = e.copy()
f.index = f.Time
x = [str(s)[:-7] for s in f.index]
ff = f.set_index(pd.Series(x))
ff.index.name = 'Time'
ff.plot()

更新

我添加了两个新图进行比较以澄清问题。现在我尝试蛮力将时间戳索引转换回字符串,并将字符串绘制为 x 轴。格式很容易搞砸。自定义 x 标签的位置似乎很难。

【问题讨论】:

    标签: python matplotlib pandas


    【解决方案1】:

    好的,您似乎想要在 x-tick 位置周围移动,以便每个刻度之间有相同数量的点。并且您希望在这些位置适当的刻度上绘制网格。我有这个权利吗?

    如果是这样:

    import pandas as pd
    import urllib
    import matplotlib.pyplot as plt
    import seaborn as sbn
    
    content = urllib.urlopen('https://eu-ats.googlecode.com/svn/trunk/data/new/eur-fix.csv')
    df = pd.read_csv(content, header=0)
    df['Time'] = pd.to_datetime(df['Time'], format='%Y-%m-%d %H:%M:%S:%f')
    
    every30 = df.loc[df.index % 30 == 0, 'Time'].values
    fig, ax = plt.subplots(1, 1, figsize=(9, 5))
    df.plot(x='Time', y='Bid', ax=ax)
    ax.set_xticks(every30)
    

    【讨论】:

    • 这太棒了,正是我想要的。非常感谢!
    【解决方案2】:

    我已尝试重现您的问题,但似乎无法重现。你能看看这个例子,看看你的情况有什么不同吗?

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sbn
    
    np.random.seed(0)
    
    idx = pd.date_range('11:00', '21:30', freq='1min')
    ser = pd.Series(data=np.random.randn(len(idx)), index=idx)
    ser = ser.cumsum()
    
    for i in range(20):
        for j in range(8):
            ser.iloc[10*i +j] = np.nan
    
    fig, axes = plt.subplots(1, 2, figsize=(10, 5))
    ser.plot(ax=axes[0])
    ser.dropna().plot(ax=axes[1])
    

    给出以下两个图:

    图表之间存在一些差异。左边的那个不连接不连续的数据位。它缺乏垂直网格线。但两者似乎都尊重数据的实际索引。你能举一个你的e系列的例子吗?它的索引的确切格式是什么?是datetime_index 还是只是文字?

    编辑:

    玩这个,我猜你的索引实际上只是文本。如果我从上面继续:

    idx_str = [str(x) for x in idx]
    newser = ser
    newser.index = idx_str
    fig, axes = plt.subplots(1, 2, figsize=(10, 5))
    newser.plot(ax=axes[0])
    newser.dropna().plot(ax=axes[1])
    

    然后我得到类似你的问题:

    更多编辑:

    如果这实际上是您的问题(索引是一堆字符串,而不是真正的一堆时间戳),那么您可以转换它们,一切都会好起来的:

    idx_fixed = pd.to_datetime(idx_str)
    fixedser = newser
    fixedser.index = idx_fixed
    fig, axes = plt.subplots(1, 2, figsize=(10, 5))
    fixedser.plot(ax=axes[0])
    fixedser.dropna().plot(ax=axes[1])
    

    产生与上面第一个代码示例相同的输出。

    再次编辑:

    要查看数据的不均匀间距,可以这样做:

    fig, axes = plt.subplots(1, 2, figsize=(10, 5))
    fixedser.plot(ax=axes[0], marker='.', linewidth=0)
    fixedser.dropna().plot(ax=axes[1], marker='.', linewidth=0)
    

    【讨论】:

    • 我想你误解了我的问题,在你给出的例子中,你有均匀分布的时间戳。我将提供数据样本,并让您知道其中的区别。谢谢,我尝试使用一种愚蠢的方式来绘制轴的字符串副本,但格式一团糟。谢谢
    • 仔细观察。我从均匀分布的索引开始。然后我将一堆数据设置为np.nan。然后我绘制数据两次。第一次绘制数据时,我以自然的方式进行绘制。第二次,我先dropna()它,所以绘制的系列在开始时的时间步长不均匀。查看右上角的图表,您会看到左侧数据稀疏的线条看起来有何不同。
    【解决方案3】:

    让我从头开始尝试这个。这能解决您的问题吗?

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sbn
    import urllib
    
    content = urllib.urlopen('https://eu-ats.googlecode.com/svn/trunk/data/new/eur-fix.csv')
    df = pd.read_csv(content, header=0, index_col='Time')
    df.index = pd.to_datetime(df.index, format='%Y-%m-%d %H:%M:%S:%f')
    df.plot()
    

    问题是,你想绘制 bidtime。如果您已将时间放入您的index,那么它们将成为您“免费”的 x 轴。如果时间数据只是另一列,那么您需要指定要将 bid 绘制为 y 轴变量,将time 绘制为 x 轴变量。因此,在您上面的代码中,即使您将 time 数据转换为 datetime 类型,您也从未指示 pandas/matplotlib 使用这些 datetimes 作为 x 轴。

    【讨论】:

    • 感谢您的回复。但我想你还是没有得到我的问题,在上图中,时间轴是均匀分布的(每个网格 30 秒),我不希望这样,我希望每个网格都有相同数量的 y(投标这种情况下),并在 x 轴上定位一些时间戳,因此时间不会均匀分布。好吧,这取决于数据,而且我的数据肯定不是时间均匀分布的。
    • 我添加了很多不同的新情节来澄清问题。
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 2020-04-04
    • 1970-01-01
    • 2017-01-09
    • 2011-04-04
    相关资源
    最近更新 更多