我一直在寻找如何从财务图表中删除星期几的方法,但一直没有成功。
我需要图表只包括工作日,完全跳过周末,以便财务图表中没有2天的间隔。
我的数据以CSV格式Open/Low/Close/High存在,其中缺少周末数据,它可以绘制出良好的图表,但我找不到如何不显示周末的方法,任何帮助都将不胜感激。
基本上,我想看到X轴上写着M/T/W/T/F/M/T/W/T/F,而不是M/T/W/T/F/S/S/M等等......
谢谢,
Chris。
我一直在寻找如何从财务图表中删除星期几的方法,但一直没有成功。
我需要图表只包括工作日,完全跳过周末,以便财务图表中没有2天的间隔。
我的数据以CSV格式Open/Low/Close/High存在,其中缺少周末数据,它可以绘制出良好的图表,但我找不到如何不显示周末的方法,任何帮助都将不胜感激。
基本上,我想看到X轴上写着M/T/W/T/F/M/T/W/T/F,而不是M/T/W/T/F/S/S/M等等......
谢谢,
Chris。
awk '{if( index( $1, "S" ) == 0 ) print $0 >> "new.dat"}' old.dat
其中old.dat
是您的原始文件,new.dat
是没有周末的新文件。在这里,我假设您的数据文件每行的第一个条目是工作日。
这也适用于Windows,但您需要先安装Windows版Gawk。
今天我刚刚接触到set xdtics
。虽然我怀疑你可能已经不再处理这个问题了,但也许对其他人有所帮助...(请参阅help xdtics
)
如果您想在时间轴上忽略周末,您可以简单地定义一个函数,在time(0)
之后返回日期编号,省略周末。请注意,对于gnuplot 5.x,time(0)
是1970-01-01 00:00:00
,而对于gnuplot 4.x,则为2000-01-01 00:00:00
。
dw5(t)
返回time(0)
之后的日期编号,省略周末,并在t
为周末时返回NaN
。dw5tow7(n)
返回“5天制”日期编号的日期,并在输入为NaN
时返回NaN
。dw7Tic(n)
返回xtic的日期标签,并在输入为NaN
时返回空字符串''
。例如,以下命令:
do for [i=0:10] { print sprintf("%s % 4d",strftime("%Y-%m-%d",dw5tow7(i)),i) }
在gnuplot5.x中将返回:
1970-01-01 0
1970-01-02 1
1970-01-05 2
1970-01-06 3
1970-01-07 4
1970-01-08 5
1970-01-09 6
1970-01-12 7
1970-01-13 8
1970-01-14 9
1970-01-15 10
脚本:(适用于gnuplot>=5.0.0,2015年1月)
### remove weekends on time scale
reset
FILE = "SO9680677.dat"
# create some random test data
set print FILE
t0 = time(0)
y0 = 100
do for [i=0:60] {
t = t0 + i*3600*24
if (int(tm_wday(t)+1)%7>1) {
print sprintf("%s %g",strftime("%Y-%m-%d",t),y0=y0+rand(0)*1-0.5)
}
}
set print
SecPerDay = 3600*24
SecPerWeek = 7*SecPerDay
isWeekend(t) = int(tm_wday(t)+1)%7 < 2
myTimeFmt = "%Y\n%m-%d"
tOff = tm_year(0)==1970 ? 3 : 5 # offset gnuplot5.x: 3, gnuplot4.x: 5
dw5(t) = isWeekend(t) ? NaN : int(t/SecPerDay) - 2*int((t+tOff*SecPerDay)/SecPerWeek)
dw5tow7(n) = n==n ? n*SecPerDay + (int(n+tOff)/5)*2*SecPerDay : NaN
dw7Tic(n) = n==n ? strftime(myTimeFmt,dw5tow7(n)) : ''
set key top center out noautotitle
set grid x,y
set ytics 1
set multiplot layout 2,1
set xrange[:] noextend
set format x myTimeFmt timedate
plot FILE u (timecolumn(1,"%Y-%m-%d")):2 w lp pt 7 lc rgb "red" ti "with weekends"
set format x "%g\n" numeric
plot FILE u (dw5(timecolumn(1,"%Y-%m-%d"))):2 w lp pt 7 lc rgb "web-green" ti "without weekends", \
'' u (t0=dw5(timecolumn(1,"%Y-%m-%d"))):(NaN):xtic(dw7Tic(t0)) every 5
unset multiplot
### end of script
### version for gnuplot 4.6.0, March 2012
set multiplot layout 2,1
set timefmt "%Y-%m-%d"
set xdata time
set format x myTimeFmt
plot FILE u 1:2 w lp pt 7 lc rgb "red" ti "with weekeends"
set format x "%g\n"
plot FILE u (dw5(timecolumn(1))):2 w lp pt 7 lc rgb "web-green" ti "without weekends", \
'' u (t0=dw5(timecolumn(1))):(NaN):xtic(dw7Tic(t0)) every 5 w p
unset multiplot
结果:
实际上,总的来说,时间范围越大,你就越不会注意到是否有周末。
文件中没有显示数据,该文件仅基于工作日并缺少周末。如果绘制数据,则在周末会出现这两天的间隙,因此我想要删除这些间隙。实际上更多是将周末包含在x轴中以使其线性。
以下是文件的部分示例:
2006-03-23T16:59 1.7470 1.7324 1.7471 1.7344 0.0000 0.0000 0.0000 0.0000
2006-03-24T16:59 1.7346 1.7308 1.7441 1.7428 0.0000 0.0000 0.0000 0.0000
2006-03-27T17:59 1.7424 1.7415 1.7492 1.7459 0.0000 0.0000 0.0000 0.0000
2006-03-28T17:59 1.7462 1.7422 1.7537 1.7424 0.0000 0.0000 0.0000 0.0000
如果您查看日期,文件中存在间隔。这是因为这些日期没有数据。然而,图表应该在没有间隔的情况下运行,这就是我试图实现的目标。
YYYY-MM-DD
。我要绘制的数据在第二列中。以下是我的gnuplot配置的相关行:set format x '%s'
plot 'file' using 0:2:xtic(substr(strcol(1),6,10))
set format
命令告诉gnuplot如何打印x轴标签。 using
配置使用第0列(即索引)作为x参数,第2列(即数据)作为y参数,并提供特殊的打印标签指令:仅打印第6-10个字符。(这将截掉年份部分,有助于标签在我的情况下适合并且不重叠。)
还可以参见此SO答案。 我不想为每个周末复制这个“破折号”解决方案,但它可能会激发灵感。
使用一些外部工具(我会为此编写一个bash或python脚本,我相信这不难),您可以将周末日期的行(每天一行)插入到数据文件中,就像这样:
2006-03-26T00:00 NaN NaN NaN NaN NaN NaN NaN NaN
(或者你可以在数据文件末尾添加那些周末的 NaN
并使用 unique
关键字)
然后绘制,比如说,第一组数据用 using 1:($2) with linespoints
,不是 using 1:2 ...
这应该适用于你。