Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于时间对数据帧进行子集设置_Python_Pandas_Performance_Datetime_Indexing - Fatal编程技术网

Python 基于时间对数据帧进行子集设置

Python 基于时间对数据帧进行子集设置,python,pandas,performance,datetime,indexing,Python,Pandas,Performance,Datetime,Indexing,我有一个数据帧,它有一个时间列,其中的值是字符串。我想对数据帧进行子集划分,以便只有位于窗口中的值才在子集中。目前我正在使用 date_format = '%Y-%m-%d' window_start = datetime.strptime('2000-01-01', date_format) window_end = datetime.strptime('2010-12-31', date_format) subs_df = pandas.DataFrame(index=np.ar

我有一个数据帧,它有一个时间列,其中的值是字符串。我想对数据帧进行子集划分,以便只有位于窗口中的值才在子集中。目前我正在使用

date_format = '%Y-%m-%d'  
window_start = datetime.strptime('2000-01-01', date_format)  
window_end = datetime.strptime('2010-12-31', date_format)  
subs_df = pandas.DataFrame(index=np.arange(0, 0),   
                      columns = list(orig_df.columns))  

for i, row in orig_df.iterrows():  
    date = datetime.strptime(row.time, date_format)  
    f date >= window_start and date <= window_end:  
        subs_df = subs_df.append(row, ignore_index=True)  
date\u格式=“%Y-%m-%d”
window_start=datetime.strtime('2000-01-01',date_格式)
window_end=datetime.strtime('2010-12-31',date_格式)
subs_df=pandas.DataFrame(索引=np.arange(0,0),
列=列表(原始列)
对于i,在orig_df.iterrows()中的行:
date=datetime.strtime(row.time,date\u格式)

f date>=窗口开始和日期是,这将很慢。以下是一些要点:

  • 使用Pandas,避免Python级别的
    for
    循环。您可以使用布尔索引,并且由于panda
    datetime
    系列在内部存储为整数,因此可以利用矢量化
  • 避免使用Pandas创建Python内置的
    datetime
    对象。改用
    pd.Timestamp
    对象。通常,当这种转换在内部进行时,字符串就足够了
  • 不惜一切代价避免在循环中使用
    pd.DataFrame.append
    。这是一个昂贵的操作,因为它涉及不必要的数据复制
下面是一个您可以做的示例:

# convert series to Pandas datetime
orig_df['time'] = pd.to_datetime(orig_df['time'])

# construct Boolean mask
mask = orig_df['time'].between('2000-01-01', '2010-12-31')

# apply Boolean mask
new_df = orig_df[mask]

是的,这会很慢。以下是一些要点:

  • 使用Pandas,避免Python级别的
    for
    循环。您可以使用布尔索引,并且由于panda
    datetime
    系列在内部存储为整数,因此可以利用矢量化
  • 避免使用Pandas创建Python内置的
    datetime
    对象。改用
    pd.Timestamp
    对象。通常,当这种转换在内部进行时,字符串就足够了
  • 不惜一切代价避免在循环中使用
    pd.DataFrame.append
    。这是一个昂贵的操作,因为它涉及不必要的数据复制
下面是一个您可以做的示例:

# convert series to Pandas datetime
orig_df['time'] = pd.to_datetime(orig_df['time'])

# construct Boolean mask
mask = orig_df['time'].between('2000-01-01', '2010-12-31')

# apply Boolean mask
new_df = orig_df[mask]