由读写arrow引发的对时间时区的思考

arrow是apache开发的一种高压缩的数据结构,发现用来存储K线还是很不错的选择。

测试用python读写很方便,关键是足够小,A股1支票1分钟的数据,1个月大约是140多K吧。

结果从数据库取出来存入arrow中,再用C++进行读取,发现总有8小时的时差问题,估计就是东八区的问题。

c++读取arrow数据,时间默认是按格林尼治时间来读取,然后存入进去的没有带时区信息,因此读,比如数据是2024年5月15日9点31分,存入应先将其转成格林时间,即减掉8小时,即2024年5月15日1点31分,然后再消除时区印迹(貌似有时间印记c++读取时会出错),这样C++那边读取的时间才能够和这里写入的时间对得上。

好,总结一下时间转换,df中的时间一般从数据库中读取或是csv中读取默认都没有时间印记,但因为我们是在中国,所有人都认为看到的时间为东八区,因此存入arrow前先做时区调整,将之本地化东八区,然后转成格林时间,再消除时间印记,存入arrow中,这样所有人从arrow中读取的时间都是格林时间,互相就对得上了。

demo示例:

读取csv数据,注意,由于已经解析了时间格式,因此不需要再额外进行时间转换:

df['time'] = pd.to_datetime(df['time'])  # 一般都是要做时间转换的,但这时已经通过parse_dates已经成功解析了时间成为了datetime64[ns]这样的类型
def read_csv(file_name):
    # 定义列名列表
    columns = ["time", "open"]
    data_types = {
        'open': 'float64'
    }
    # 读取 CSV 文件,指定列名
    df_read = pd.read_csv(file_name, names=columns, dtype=data_types, header=None, parse_dates=["time"])
    # 打印读取后的 DataFrame
    print(df_read)
    return df_read

写入arrow:

def write_arrow(df: DataFrame, file_name):
    import pyarrow as pa
    import pyarrow.parquet as pq
    if not df['time'].dt.tz:
        pd.to_datetime(df['time']).dt.tz_loc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值