Python-计算价格和提取时间之间的差异

Python-计算价格和提取时间之间的差异,python,pandas,datetime,Python,Pandas,Datetime,我需要创建一个新列,其值应为: 当前公平价格-15分钟前公平价格(或最近一行) 我需要在15分钟前过滤谁是行,然后计算差异 import numpy as np import pandas as pd from datetime import timedelta df = pd.DataFrame(pd.read_csv('./data.csv')) def calculate_15min(row): end_date = pd.to_datetime(row['date']) -

我需要创建一个新列,其值应为:

当前公平价格-15分钟前公平价格(或最近一行)

我需要在15分钟前过滤谁是行,然后计算差异

import numpy as np
import pandas as pd
from datetime import timedelta

df = pd.DataFrame(pd.read_csv('./data.csv'))


def calculate_15min(row):
    end_date = pd.to_datetime(row['date']) - timedelta(minutes=15)
    mask = (pd.to_datetime(df['date']) <= end_date).head(1)
    price_before = df.loc[mask]
    return price_before['fair_price']


def calc_new_val(row):
    return 'show date 15 minutes before, maybe it will be null, nope'


df['15_min_ago'] = df.apply(lambda row: calculate_15min(row), axis=1)

myFields = ['pkey_id', 'date', '15_min_ago', 'fair_price']
print(df[myFields].head(5))
df[myFields].head(5).to_csv('output.csv', index=False)



这是CSV,首先将日期列转换为日期时间数据类型:

df['date']=pd.to_datetime(df['date'])
然后筛选值:

date15min=df['date']-pd.offsets.DateOffset(minutes=15)
out=df.loc[df['date'].isin(date15min.tolist())]
现在,最后进行计算:

df['price_before_15min']=df['fair_price'].where(df['date'].isin((out['date']+pd.offsets.DateOffset(minutes=15)).tolist()))
df['price_before_15min']=df['price_before_15min'].diff()
df['date_before_15min']=date15min
现在,如果您打印
df
,您将获得所需的输出

更新: 为此,只需对上述方法稍作更改:

out=df.loc[df['date'].dt.minute.isin(date15min.dt.minute.tolist())]
df['price_before_15min']=df['fair_price'].where(df['date'].dt.minute.isin((out['date']+pd.offsets.DateOffset(minutes=15)).dt.minute.tolist()))

在您的示例数据集中,没有一个“日期”与“15分钟前”的日期匹配,因此您如何计算公平价格与15分钟前公平价格之间的差异?你好,朋友,是的,您是对的。我对它进行了编辑,现在我们有足够的数据来做。。我只需要得到第一个数据你好,朋友,谢谢你的帮助,但它仍然不好。。。有一行时间为12:43:30,那么我们可以在=12:28:30之前15分钟(第一行)计算差异,但在本例中,我们需要为12:43:30之前的所有列设置null,因为我们无法在15分钟之前过滤,您同意吗?我可以给你发送600行的完整csv,但我不知道如何使用stackoverflowFriend更新答案…请看一看,让我知道你是否获得了预期输出,如果你将获得输出,那么我将添加解释:)是的,兄弟,太棒了。你太棒了。但事实上我解释得不对。。。在前15分钟之后,如果有1秒的差异,则右侧将获得下一个值。。你明白了吗?很多行是空的,因为存在15:01而不是15:00的差异,我们可以得到第一行=>15分钟的差异…嘿,朋友…更新的答案…请看一看,让我知道它是否有效:)
out=df.loc[df['date'].dt.minute.isin(date15min.dt.minute.tolist())]
df['price_before_15min']=df['fair_price'].where(df['date'].dt.minute.isin((out['date']+pd.offsets.DateOffset(minutes=15)).dt.minute.tolist()))