[Python] 读/写/查询 .bcolz 文件

1. 读取

.bcolz 文件读为 DataFrame

import bcolz

f = bcolz.open('/tmp/test.bcolz')
df = f.todataframe()

2. 写入

  • 方法一: bcolz.fromiter
ct2 = bcolz.fromiter(
	((i,i*i) for i in range(N)), 
	dtype="i4,f8", 
	count=N, 
	rootdir="./ct2.bcolz")
  • 方法二: ctable.append
with bcolz.zeros(0, dtype="i4,f8", mode='w', rootdir="./ct1.bcolz") as ct1:
    for i in range(20000):
        ct1.append((i, i**2))
  • 方法三: ctable.addcol
with bcolz.zeros(0, dtype="i4,f8", mode='w', rootdir="./ct3.bcolz") as ct3:
    new_col = np.linspace(0, 1, N)
    ct3.addcol(new_col)
  • 方法四: ctable.fromdataframe
ct4 = bcolz.ctable.fromdataframe(df, rootdir='./ct4.bcolz')

3. 查询

  • 方法一
ct = bcolz.open('./ct.bcolz')
df = ct.todataframe()
df = df.loc[(df.date>20160101)&(df.date<=20160201)]
  • 方法二
ct = bcolz.open('./ct.bcolz')
ct = ct.where('(date>20160101)&(date<=20160201)')
df = pd.DataFrame(ct

附:

bcolz 中的 dtype 的写法与 numpy 一样

类型         简写                描述
bool_       'b'          布尔型数据类型(True 或者 False)
int_        'i8'         默认的整数类型(int32 或 int64)
intc        'i4/i8'      一般是 int32 或 int 64
intp        'i4/i8'      用于索引的整数类型(一般情是 int32 或 int64)
int8        'i1'         字节(-128 to 127)
int16       'i2'         整数(-32768 to 32767)
int32       'i4'         整数(-2147483648 to 2147483647)
int64       'i8'         整数(-9223372036854775808 to 9223372036854775807)
uint8       'u1'         无符号整数(0 to 255)
uint16      'u2'         无符号整数(0 to 65535)
uint32      'u4'         无符号整数(0 to 4294967295)
uint64      'u8'         无符号整数(0 to 18446744073709551615)
float_      'f8'         float64 类型的简写
float16     'f2'         半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32     'f4'         单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64     'f8'         双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_    'c16'        complex128 类型的简写,即 128 位复数
complex64   'c8'         复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128  'c16'        复数,表示双 64 位浮点数(实数部分和虚数部分)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章