根据时间设置熊猫DataFrame

时间:2018-10-14 22:44:48

标签: 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.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)  

这非常慢。我感觉自己在做一些根本错误的事情。有什么更好的方法?

谢谢您的时间。

1 个答案:

答案 0 :(得分:2)

是的,这会很慢。这里有一些指针:

  • 对于Pandas,请避免使用Python级for循环。您可以使用布尔索引,并且由于熊猫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]