【问题标题】:subsetting a pandas DataFrame based on time根据时间对 pandas DataFrame 进行子集化
【发布时间】:2019-03-19 08:22:09
【问题描述】:

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

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)  

这非常慢。我有一种感觉,我在做一些根本错误的事情。有什么更好的方法来做到这一点?

感谢您的宝贵时间。

【问题讨论】:

    标签: python pandas performance datetime indexing


    【解决方案1】:

    是的,这会很慢。这里有一些提示:

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

    【讨论】:

      猜你喜欢
      • 2019-01-30
      • 2015-04-13
      • 2013-10-25
      • 2020-01-16
      • 2017-05-21
      • 2021-03-21
      • 2021-12-03
      • 2016-09-10
      • 1970-01-01
      相关资源
      最近更新 更多