基于两列中匹配值的日期差

2024-10-02 10:19:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,我正在努力创建一个基于其他列的列,我将为一个示例数据共享这个问题。你知道吗

          Date  Target1      Close
0   2018-05-25  198.0090    188.580002
1   2018-05-25  197.6835    188.580002
2   2018-05-25  198.0090    188.580002
3   2018-05-29  196.6230    187.899994
4   2018-05-29  196.9800    187.899994
5   2018-05-30  197.1375    187.500000
6   2018-05-30  196.6965    187.500000
7   2018-05-30  196.8750    187.500000
8   2018-05-31  196.2135    186.869995
9   2018-05-31  196.2135    186.869995
10  2018-05-31  196.5600    186.869995
11  2018-05-31  196.7700    186.869995
12  2018-05-31  196.9275    186.869995
13  2018-05-31  196.2135    186.869995
14  2018-05-31  196.2135    186.869995
15  2018-06-01  197.2845    190.240005
16  2018-06-01  197.2845    190.240005
17  2018-06-04  201.2325    191.830002
18  2018-06-04  201.4740    191.830002

我想为每个观察创建另一个列(例如,称为days\ u to\ u hit\ u target),它是接近命中(或穿过特定日期的目标)的天数差,然后计算天数差并将它们放入days\ u to\ u hit\ u target列。你知道吗

我们的想法是,假设2018年5月25日今天的收盘价是188.58,那么,我想得到这个目标(198.0090)达到收盘价的日期,它在2018年6月4日晚些时候的某个时候正在做,收盘价已经达到了第一次观察的目标(198.0090),这将被输入到专栏的第一次观察(达到目标的天数)。你知道吗


Tags: to示例target目标dataframeclosedatedays
2条回答
import pandas as pd

csv = pd.read_csv(
    'sample.csv',
    parse_dates=['Date']
)

csv.sort_values('Date', inplace=True)

def find_closest(row):

    target = row['Target1']
    date = row['Date']

    matches = csv[
        (csv['Close'] >= target) &
        (csv['Date'] > date)
    ]

    closest_date = matches['Date'].iloc[0] if not matches.empty else None

    row['days to hit target'] = (closest_date - date).days if closest_date else None

    return row


final = csv.apply(find_closest, axis=1)

测试起来有点困难,因为没有一个目标出现在近处。但想法很简单。对原始帧进行子集划分,使date在当前行日期之后,Close大于或等于Target1,然后获取第一个条目(这是在使用df.sort_values对其进行排序之后)。你知道吗

如果子集为空,则使用“无”。否则,使用DateDays to hit target在这一点上非常简单。你知道吗

使用locat的组合来查找目标命中的日期,然后减去日期。你知道吗

df['TargetDate'] = 'NA'
for i, row in df.iterrows():
    t = row['Target1']
    d = row['Date']
    targdf = df.loc[df['Close'] >= t]
    if len(targdf)>0:
       targdt = targdf.at[0,'Date']
       df.at[i,'TargetDate'] = targdt
    else:
       df.at[i,'TargetDate'] = '0'

df['Diff'] = df['Date'].sub(df['TargetDate'], axis=0)

相关问题 更多 >

    热门问题