import os
import pandas as pd
from pandas import Timedelta
from stock_c.csv2dataframe import import_csv
# 用通达信小周期,生成大周期数据
def csv_resample(df, rule) -> pd.DataFrame:
# 重新采样Open列数据
df_open = round(df['Open'].resample(rule=rule, closed='right', label='left').first(), 2)
df_high = round(df['High'].resample(rule=rule, closed='right', label='left').max(), 2)
df_low = round(df['Low'].resample(rule=rule, closed='right', label='left').min(), 2)
df_close = round(df['Close'].resample(rule=rule, closed='right', label='left').last(), 2)
df_volume = round(df['Volume'].resample(rule=rule, closed='right', label='left').sum(), 2)
# print("新周期数据已生成")
# 生成新周期数据
df_15t = pd.DataFrame()
df_15t = df_15t.assign(Open=df_open)
df_15t = df_15t.assign(High=df_high)
df_15t = df_15t.assign(Low=df_low)
df_15t = df_15t.assign(Close=df_close)
df_15t = df_15t.assign(Volume=df_volume)
# 去除空值
df_15t = df_15t.dropna()
return df_15t
# 根据通达信5分钟周期数据,生成其他周期数据
def lc5_resample(filepath, name, targetdir, rule) -> None:
# (通达信.lc5文件路径, 通达信.lc5文件名称, 处理后要保存到的文件夹)
# 设置处理后保存文件的路径和名称
print("周期转换已开始: " + rule)
file_object_path = targetdir + name.split('.')[0] + ".lc" + rule[:len(rule) - 1] + '.csv'
df = import_csv(filepath)
if rule == '60T':
df = round(change_13_11_14_12(df), 2)
df = csv_resample(df, rule)
df.to_csv(file_object_path)
print("数据转换已完成: " + name)
def lc5_rule(rule):
# 设置通达信5分钟周期数据文件所在的文件夹
path_dir = '../lc5/'
# 设置要转换的新周期
rule_cycle = rule
# 设置数据处理好后,要将csv文件保存的文件夹
target_dir = '../lc' + rule_cycle[:len(rule_cycle) - 1] + '/'
# 读取文件夹下的通达信.lc5.csv文件
listfile = os.listdir(path_dir)
# 逐个处理文件夹下的通达信.lc5.csv文件,并生成对应的csv文件,保存到对应周期文件夹下
for fname in listfile:
lc5_resample(path_dir + fname, fname, target_dir, rule_cycle)
else:
print('The for ' + path_dir + ' to ' + target_dir + ' loop is over')
print("文件转换已完成")
def change_13_11_14_12(df) -> pd.DataFrame:
date = []
for i in df.index:
if i.hour == 13:
i = i - Timedelta('02:00:00')
if i.hour == 14 and i.minute == 0 and i.second == 0:
i = i - Timedelta('02:00:00')
date.append(i)
df = df.assign(Date=pd.Series(date, index=df.index))
df.set_index(['Date'], inplace=True)
return df
# 转换成新周期
lc5_rule('10T')
lc5_rule('15T')
lc5_rule('30T')
lc5_rule('60T')
# 读取csv文件,返回pd.DataFrame对象
def import_csv(stock_code) -> pd.DataFrame:
df = pd.read_csv(stock_code)
df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d')
df.set_index(['Date'], inplace=True)
return df
04-13
3949

08-10
07-27
2052
