我需要从二进制文件中提取金融价格数据。通常使用C#代码来提取这些价格数据。我遇到的最大问题是获得有意义的日期时间。
二进制数据看起来像这样:
'\x14\x11\x00\x00{\x14\xaeG\xe1z(@\x9a\x99\x99\x99\x99\x99(@q=\n\xd7\xa3p(@\x9a\x99\x99\x99\x99\x99(@\xac\x00\x19\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00"\xd8\x18\xe0\xdc\xcc\x08'
提取正确的C#代码是:
提取它的正确的C#代码是:
StockID = reader.ReadInt32();
Open = reader.ReadDouble();
High = reader.ReadDouble();
Low = reader.ReadDouble();
Close = reader.ReadDouble();
Volume = reader.ReadInt64();
TotalTrades = reader.ReadInt32();
Timestamp = reader.ReadDateTime();
这是我在Python中的进展情况。我有几个关注点。
In [1]: barlength = 56; barformat = 'i4dqiq'
In [2]: pricebar = f.read(barlength)
In [3]: pricebar
Out[3]: '\x95L\x00\x00)\\\x8f\xc2\xf5\xc8N@D\x1c\xeb\xe26\xcaN@\x7fj\xbct\x93\xb0N@\xd7\xa3p=\n\xb7N@\xf6\xdb\x02\x00\x00\x00\x00\x00J\x03\x00\x00\x00"\xd8\x18\xe0\xdc\xcc\x08'
In [4]: struct.unpack(barformat, pricebar)
Out[4]:
(19605, # stock id
61.57, # open
61.579800000000006, # high
61.3795, # low
61.43, # close
187382, # volume -- seems reasonable
842, # TotalTrades -- seems reasonable
634124502600000000L # datetime -- no idea what this means!
)
我使用Python内置的struct模块,但是对它有一些顾虑。
我不确定C#代码中的哪些格式字符对应于Int32和Int64,尽管尝试了几种不同的方法,但返回的Python元组相同。
我感到担忧的是,某些字段的输出似乎对我指定的格式不太敏感:例如,如果我将TotalTrades字段指定为signed或unsigned int或signed或unsigned long(l、L、i或I),则返回的值相同。
我无法理解日期返回字段。这实际上是我遇到的最大问题。