按日期分区的 kdb 中的勾选数据 table:我应该使用时间列还是日期时间列?

Tick data in kdb partitioned-by-date table: should I use a time or datetime column?

当使用按日期分区的 table 时,q/kdb+ 中的报价级别数据集(交易或报价)的标准规范时间列是什么?除了分区之外,我还应该有时间列还是日期时间列?我看到了以下优点和缺点,但也许我遗漏了一些东西:

时间戳列:缺点:我在磁盘上和显示时都存储了冗余数据;所以 table 中的 select 其中 date=max date 有效地向我显示了两次日期;但是优点:与 Python 交互要容易得多,如果我想

我可以更轻松地重新分区数据

时间列:缺点:Messier 与 Python 交互;优点:我在执行 select

时没有两次看到日期

我知道各个数据类型的大小(以字节为单位),所以我知道我可能不会保存 space 如果例如我要用时间戳 (`p) 替换时间跨度 (`n) ),但我这辈子都记不起做过 select(我以前也和 q 一起在银行工作过)并且看过两次日期!

这真的取决于数据集。如果你以前在银行工作过——它可能在 equities—which has defined market open hours by region/exchange and therefore a timestamp is unnecessary alongside the date. Other assets, such as FX,是 24/7,所以时间戳更重要。正如您所说,时间跨度不会节省 space,但如果您关心超过毫秒的精度,则可能有必要,例如,时间是字节数的一半,但精度会降低。

值得注意的是,日期列是虚拟的,基于分区,因此存储在磁盘上不需要任何成本,因为它只是目录名称。这当然会在加载并发送到您的 Python 应用程序时消耗内存(我不确定 q 端的开销是多少,但是对于带有传输等的 Python 应用程序来说它会花费更多.).如果在 Python 中使用时间戳更容易,那为什么不保留它呢?

如果你介意出现两次的日期,可以在select之后偷偷删掉:

delete date from select from t

或者在基于列的select中忽略它

select col1, col2 from t

on-disk 报价数据中的时间列最重要的考虑因素之一是它是否可以用于 as-of 连接 aj。为此,您希望在每个 ticker/sym 内对时间列进行排序(假设您在 ticker/sym 列上有 p#,建议用于报价数据),只要此时间列具有基础 long/integer 类型(时间戳和时间跨度都做,日期时间不做)然后 aj 将是最佳的。

因此,您再次“看到”日期这一事实并不是什么大问题。另一件需要注意的事情:如果你确实使用时间戳,那么你的时间戳有可能在给定的日期片中跨越多个日期吗?也就是说,你能有前一天的记录吗?如果是这样,那么就像这样:

select from table where date=2022.02.01, time>23:00

理论上可以 return 从 两个 日期开始 >23:00 的记录。