【发布时间】:2020-03-18 12:51:29
【问题描述】:
我正在使用 400.000 行数据框(实际上更大,但出于测试目的,我使用了这个维度)。
我需要根据两个条件将多个文件导出为 txt/csv:#RIC 和日期。
在这些条件下循环是一个非常缓慢的过程,所以我正在寻找一些更快的方法来做到这一点。
这是我最初的想法:
def SaveTxt(df, output_folder=None):
# Start time
start_time = time.time()
# Data Frame with date
df['Date'] = pd.to_datetime(df['Date-Time']).dt.date
dates = df['Date'].unique()
ticks = df['#RIC'].unique()
for tick in ticks:
for date in dates:
# print(date, tick)
# Filtering by instrument and date
temp_df = df[(df['#RIC'] == tick) & (df['Date'] == date)]
if temp_df.empty:
pass
else:
# Saving files
if output_folder in [None, ""]:
temp_df.to_csv("%s_%s.txt" % (date, tick))
else:
temp_df.to_csv("%s\\%s_%s.txt" % (output_folder, date, tick))
# Elapsed time
elapsed_time = time.time() - start_time
elapsed_time = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
# Priting elapsed time
print('Elapsed time: %s' % elapsed_time)
对于 400.000 行(相当于 5 天的数据),运行此脚本需要 3 分钟。一年,需要6个小时,我没有尝试10年,但我认为这不是一个好主意。
解决方案构思
我已经尝试从 df 中删除每个循环中使用的数据,但这种情况不起作用(也许这会删除数据框的大小并加快代码转换速度):
df = df[(df['#RIC'] != tick) & (df['Date'] != date)]
我相信这应该从数据框中删除每个刻度和日期,但它会单独应用此条件。
如果你们有解决这个问题的办法,我将不胜感激。
谢谢
编辑
不知道这是否是分享数据样本的最佳方式(我无法通过代理上传)
#RIC 日期价格量 DIJF21 2019 年 10 月 16 日 4.64 15 DIJF21 2019 年 10 月 16 日 4.64 40 DIJF21 2019 年 10 月 16 日 4.64 100 DIJF21 16/10/2019 4.64 5 DIJF21 16/10/2019 4.64 1765 DIJF21 16/10/2019 4.64 10 DIJF21 2019 年 10 月 16 日 4.64 100 DIJF21 2019 年 10 月 16 日 4.64 1000 DIJF21 16/10/2019 4.64 5 DIJF21 2019 年 10 月 16 日 4.64 20 DIJF21 2019 年 10 月 16 日 4.64 80 DIJF21 2019 年 10 月 16 日 4.64 25 DIJF21 2019 年 10 月 16 日 4.64 25 DIJF21 2019 年 10 月 16 日 4.64 150 DIJF20 15/10/2019 4.905 2000 DIJF20 15/10/2019 4.905 2000 DIJF20 2019 年 15 月 10 日 4.903 10
【问题讨论】:
-
您的示例对我来说效果很好。如果您不确定,请查看stackoverflow.com/questions/20109391/… :)