【发布时间】:2021-02-10 16:50:13
【问题描述】:
在下面的代码中,我创建了具有每日数据的 df_d 和具有 5 分钟间隔的日内数据的 df_i。
我在 df_d 中有 3 列(Volume、Volume1 和 Volume2),我想在各个日期传播到 df_i。 p>
当我调用df_i, df_d = main_process() 时,代码实现了结果。但是,当我在大数据上运行它时,这会占用大量时间。
如何只用一个 np.where 语句更新 df_i 的 3 列?或者就此而言,实现这一目标的最快方法是什么?
import pandas as pd
import numpy as np
import datetime
def dt_to_integer( dt_time):
return 10000*dt_time.year + 100*dt_time.month + dt_time.day
def main_process():
todays_date = datetime.datetime.now().date()
index = pd.date_range( todays_date, periods=5, freq='D')
columns = [ 'Volume', 'Volume1', 'Volume2']
df_d = pd.DataFrame( index=index, columns=columns)
df_d[ 'Volume'] = df_d.index.day * 100
df_d[ 'Volume1'] = df_d.index.day * 500
df_d[ 'Volume2'] = df_d.index.day * 1000
todays_date = datetime.datetime.now().date()
index = pd.date_range( todays_date, periods=1440, freq='5min')
columns = [ 'Volume', 'Volume1', 'Volume2']
df_i = pd.DataFrame( index=index, columns=columns)
df_i = df_i.loc[ df_i.index.isin( df_i.between_time('09:30:00', '16:00:00').index)]
for i in range( len( df_d)):
the_date = dt_to_integer( df_d.index[i])
df_i.Volume = np.where( dt_to_integer( df_i.index) == the_date, df_d.Volume[ i], df_i.Volume)
df_i.Volume1 = np.where( dt_to_integer( df_i.index) == the_date, df_d.Volume1[ i], df_i.Volume1)
df_i.Volume2 = np.where( dt_to_integer( df_i.index) == the_date, df_d.Volume2[ i], df_i.Volume2)
return df_i, df_d
df_i, df_d = main_process()
【问题讨论】:
标签: dataframe numpy array-broadcasting