根据 Pandas DataFrame 中的范围选择行

问题描述 投票:0回答:1

我正在编写一个程序,其中包括从 Pandas DataFrame 中选择行的子集。 DataFrame 对新闻标题和日期有情感。 它有一行“日期”,根据新闻标题定义日期,这

这是我感兴趣的代码的一部分。

def simulation_trading(data, period_days = 1):

    dates_unique = data["Date"].unique()

    previous = 0
    for index in range(period_days - 1, len(data), period_days):
        dates_unique_chunk = dates_unique[previous:index+1]
        if not list(dates_unique_chunk):
            continue

        after_start_date = data["Date"] >= dates_unique_chunk[0]
        before_end_date = data["Date"] <= dates_unique_chunk[-1]
        between_two_dates = after_start_date & before_end_date
        data_chunk = data.loc[between_two_dates]
        print(dates_unique_chunk[-1], dates_unique_chunk[0])
        print(data_chunk["Date"])
        sentiments_chunk = data_chunk["Labels"]
        break
       

我首先得到一个唯一日期的列表。然后我得到特定时期的一系列日期。

dates_unique = data["Date"].unique()

dates_unique_chunk = dates_unique[previous:index+1]

这里展示了一部分代码,我使用一种方法来制作掩码并将其应用于感兴趣的数据帧。

我已经尝试了我在这里找到的所有方法:使用 . Between() 函数、isin() 和dates_range() 等。它们都不起作用,所以这并不是不起作用的方法。它不返回指定的范围。 生成下一个示例的代码:

    print(simulation_trading(sentiments_data, 2))

[在顶行中,我根据索引 [-1] 和 [0] 回显了日期,这里是我从打印 data_chunk["Date]]](https://i.stack.imgur.com/m9Zez.png)

如果我应用的范围的第一个元素等于第二个元素,问题就会消失。 生成下一个示例的代码:

    print(simulation_trading(sentiments_data, 1))

例如:Here i have the same dates according to indexes [-1] and [0] and here what i got from printing data_chunk[

python pandas date range
1个回答
0
投票

从您的描述和代码片段来看,您似乎正在尝试根据日期范围将数据分区为块,其中每个块涵盖由 period_days 定义的时间段。您的方法涉及过滤 DataFrame 以仅包含属于每个日期范围内的行。

当尝试使用布尔掩码过滤数据以选择两个日期之间的行时,会出现您的问题,但您发现它仅在开始日期和结束日期相同时才按预期工作。这是一个常见问题,通常可以通过确保正确定义日期范围并且 DataFrame 的“日期”列采用正确的格式(即作为日期时间对象)来解决。

这是函数的修订方法,可确保正确处理日期:

  1. 将“日期”列转换为日期时间(如果尚未转换)。这样可以保证日期对象之间进行比较,更加可靠。

  2. 按“日期”对数据进行排序,以确保其按时间顺序排列。这对于时间序列数据至关重要。

  3. 使用pd.to_datetime转换dates_unique,保证所有日期操作一致。

    import pandas as pd
    
    def simulation_trading(data, period_days=1):
    
    data['Date'] = pd.to_datetime(data['Date'])
    
    
    data.sort_values('Date', inplace=True)
    
    
    dates_unique = pd.to_datetime(data['Date'].unique())
    dates_unique.sort()
    
    previous = 0
    for index in range(period_days - 1, len(dates_unique), period_days):
    dates_unique_chunk = dates_unique[previous:index+1]
    if not len(dates_unique_chunk):
        continue
    
    
    after_start_date = data['Date'] >= dates_unique_chunk[0]
    before_end_date = data['Date'] <= dates_unique_chunk[-1]
    between_two_dates = after_start_date & before_end_date
    data_chunk = data.loc[between_two_dates]
    
    print(dates_unique_chunk[-1], dates_unique_chunk[0])
    print(data_chunk['Date'])
    
    sentiments_chunk = data_chunk['Labels']
    
    
    break  
    

此版本的函数应正确过滤您的 DataFrame,以仅包含基于 period_days 的每个计算日期范围内的行。请记住根据您打算如何在循环中处理或输出块来删除或调整break语句。

© www.soinside.com 2019 - 2024. All rights reserved.