shepherdpp / qteasy

a python-based fast quantitative investment module
BSD 3-Clause "New" or "Revised" License
73 stars 28 forks source link

从本地读取分钟线数据时会出现错误 #140

Closed huhushengweimao closed 6 months ago

huhushengweimao commented 7 months ago

Describe the bug / 描述bug内容

从本地读取分钟线数据会提示没有有属性,主要问题是读取的数据时间列进行转化为datetime格式的时候,没有加入 tradetime这种类型,只有date 和 timestamp

huhushengweimao commented 7 months ago

def set_datetime_format_frame(df, primary_key, pk_dtypes): """ 根据primary_key的rule为df的主键设置正确的时间日期类型

Parameters
----------
df: pd.DataFrame
    需要操作的df
primary_key: list of str
    主键列
pk_dtypes: list of str
    主键数据类型,主要关注"date" 和"TimeStamp"

Returns
-------
None

Examples
--------
>>> df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
>>> df = set_primary_key_frame(df, ['a'], [int])
>>> df
     a    b
0    1    4
1    2    5
2    3    6
>>> set_primary_key_index(df, ['a'], ['int'])
>>> df
     b
a
1    4
2    5
3    6
>>> set_datetime_format_frame(df, ['a'], ['date'])
>>> df
                                 b
a
1970-01-01 00:00:00.000000001    4
1970-01-01 00:00:00.000000002    5
1970-01-01 00:00:00.000000003    6

"""
#这里有bug啊,分钟线不能用。。。。
# 设置正确的时间日期格式(找到pk_dtype中是否有"date"或"TimeStamp"类型,将相应的列设置为TimeStamp
'''

if ("date" in pk_dtypes) or ("TimeStamp" in pk_dtypes):
    # 需要设置正确的时间日期格式:
    # 有时候pk会包含多列,可能有多个时间日期,因此需要逐个设置
    for pk_item, dtype in zip(primary_key, pk_dtypes):
        if dtype in ['date', 'TimeStamp']:
            df[pk_item] = pd.to_datetime(df[pk_item])
'''            

if ("date" in pk_dtypes) or ("TimeStamp" in pk_dtypes) or ("datetime" in pk_dtypes):
    # 需要设置正确的时间日期格式:
    # 有时候pk会包含多列,可能有多个时间日期,因此需要逐个设置
    for pk_item, dtype in zip(primary_key, pk_dtypes):
        if dtype in ['date', 'TimeStamp','datetime']:
            df[pk_item] = pd.to_datetime(df[pk_item])

这么修改下就好了

shepherdpp commented 7 months ago

感谢您提供的信息,我确认一下

shepherdpp commented 6 months ago

我把上面的代码修改成为:

if any(dtype in pk_dtypes for dtype in ['date', 'datetime', 'TimeStamp']):
    # 需要设置正确的时间日期格式:
    # 有时候pk会包含多列,可能有多个时间日期,因此需要逐个设置
    for pk_item, dtype in zip(primary_key, pk_dtypes):
        if dtype in ['date', 'TimeStamp', 'datetime']:
            df[pk_item] = pd.to_datetime(df[pk_item])
return None

由于 unittest 没有覆盖到,因此没有抓住这个问题,感谢您的意见,我会更新test case,测试无误后在下一个版本中更新!

shepherdpp commented 6 months ago

这个bug已经在最新版的qteasy中修复!请更新最新版本的qteasy并检验一下:

$ pip install qteasy -U

如果确认问题已经解决,请关闭此Issue,如果还有其他问题,请发起新的Issue,非常感谢!