Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在多索引数据框中将数据延迟x个特定天数?_Python_Pandas_Indexing_Loc - Fatal编程技术网

Python 如何在多索引数据框中将数据延迟x个特定天数?

Python 如何在多索引数据框中将数据延迟x个特定天数?,python,pandas,indexing,loc,Python,Pandas,Indexing,Loc,我有一个数据框,其中包含日期、资产,然后是价格/数量数据。我试图从7天前提取数据,但问题是我不能使用shift(),因为我的表中缺少日期 date cusip price price_7daysago 1/1/2017 a 1 1/1/2017 b 2 1/2/2017 a 1.2 1/2/2017 b 2.3 1/8/2017 a 1.1 1 1/8/2017 b 2.2

我有一个数据框,其中包含日期、资产,然后是价格/数量数据。我试图从7天前提取数据,但问题是我不能使用shift(),因为我的表中缺少日期

 date   cusip   price   price_7daysago
1/1/2017    a   1   
1/1/2017    b   2   
1/2/2017    a   1.2 
1/2/2017    b   2.3 
1/8/2017    a   1.1         1
1/8/2017    b   2.2         2
我尝试创建一个lambda函数来尝试使用loc和timedelta来创建此移位,但我只能输出空的numpy数组:

def row_delta(x, df, days, colname):
    if datetime.strptime(x['recorddate'], '%Y%m%d') - timedelta(days) in [datetime.strptime(x,'%Y%m%d') for x in   df['recorddate'].unique().tolist()]:
        return df.loc[(df['recorddate_date'] == df['recorddate_date'] - timedelta(days)) & (df['cusip'] == x['cusip']) ,colname]
    else:
        return 'nothing'
我也想过做一些类似的事情来填补缺失的日期,但我的问题是我有多个索引,日期和CUSIP,所以我不能只是重新索引这个


我真的不知道我还能做什么,但任何帮助都将不胜感激

merge
DataFrame
与其自身合并,同时在右侧框架的日期列中添加7天。使用
后缀
参数适当地命名列

import pandas as pd

df['date'] = pd.to_datetime(df.date)
df.merge(df.assign(date = df.date+pd.Timedelta(days=7)), 
         on=['date', 'cusip'],
         how='left', suffixes=['', '_7daysago'])
输出:
df

        date cusip  price  price_7daysago
0 2017-01-01     a    1.0             NaN
1 2017-01-01     b    2.0             NaN
2 2017-01-02     a    1.2             NaN
3 2017-01-02     b    2.3             NaN
4 2017-01-08     a    1.1             1.0
5 2017-01-08     b    2.2             2.0

merge
DataFrame
与其自身合并,同时在右侧框架的日期列中添加7天。使用
后缀
参数适当地命名列

import pandas as pd

df['date'] = pd.to_datetime(df.date)
df.merge(df.assign(date = df.date+pd.Timedelta(days=7)), 
         on=['date', 'cusip'],
         how='left', suffixes=['', '_7daysago'])
输出:
df

        date cusip  price  price_7daysago
0 2017-01-01     a    1.0             NaN
1 2017-01-01     b    2.0             NaN
2 2017-01-02     a    1.2             NaN
3 2017-01-02     b    2.3             NaN
4 2017-01-08     a    1.1             1.0
5 2017-01-08     b    2.2             2.0

您可以将
date
cusip
设置为索引,并一起使用
unstack
shift

shifted = df.set_index(["date", "cusip"]).unstack().shift(7).stack()

然后,只需将
shift
与原始
df
合并,就可以将
日期
cusip
设置为索引,并将
取消堆栈
shift
一起使用

        date cusip  price  price_7daysago
0 2017-01-01     a    1.0             NaN
1 2017-01-01     b    2.0             NaN
2 2017-01-02     a    1.2             NaN
3 2017-01-02     b    2.3             NaN
4 2017-01-08     a    1.1             1.0
5 2017-01-08     b    2.2             2.0
shifted = df.set_index(["date", "cusip"]).unstack().shift(7).stack()

然后简单地将
shift
与您的原始
df

合并所需输出?抱歉,混淆-用所需输出更新(7天前的延迟)所需输出?抱歉,混淆-用所需输出更新(7天前的延迟)哈哈。。。我们两个都关注这个问题,可以用
'
来代替
nan
s,用
'
哈哈。。。我们两人都关注这个问题,可以用
'
fillna替换
nan
s
        date cusip  price  price_7daysago
0 2017-01-01     a    1.0             NaN
1 2017-01-01     b    2.0             NaN
2 2017-01-02     a    1.2             NaN
3 2017-01-02     b    2.3             NaN
4 2017-01-08     a    1.1             1.0
5 2017-01-08     b    2.2             2.0