我的数据框有不均匀的时间索引。
我怎样才能找到一种绘制数据的方法,并自动将索引本地化?我在这里搜索,我知道我可以绘制类似
的内容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标签的位置。
答案 0 :(得分:6)
好吧,看起来你想要的是想要在x-tick位置移动,以便每个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)
答案 1 :(得分: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)
答案 2 :(得分:2)
让我从头开始尝试这个。这会解决您的问题吗?
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()
问题是,你想要bid
vs time
。如果您已将时间放入index
,则它们将成为“免费”的x轴。如果时间数据只是另一列,则需要指定要将bid
绘制为y轴变量,将time
绘制为x轴变量。因此,在上面的代码中,即使您将time
数据转换为datetime
类型,也绝不会指示pandas
/ matplotlib
将datetimes
用作{{1}} x轴。