Python 熊猫切片

Python 熊猫切片,python,pandas,indexing,slice,Python,Pandas,Indexing,Slice,我有一份包含日期的清单。看起来是这样的: [datetime.date(1994, 2, 4), datetime.date(1994, 3, 22), datetime.date(1994, 4, 18), datetime.date(1994, 5, 17), datetime.date(1994, 8, 16) ...] 熊猫df看起来像: Date USD_I 0 1971-01-04 100.0000 1

我有一份包含日期的清单。看起来是这样的:

    [datetime.date(1994, 2, 4),
     datetime.date(1994, 3, 22),
     datetime.date(1994, 4, 18),
     datetime.date(1994, 5, 17),
     datetime.date(1994, 8, 16)
     ...]
熊猫df看起来像:

    Date    USD_I
0   1971-01-04  100.0000
1   1971-01-05  99.9700
2   1971-01-06  99.9500
3   1971-01-07  99.9400
4   1971-01-08  99.9300
5   1971-01-11  99.9100
6   1971-01-12  99.8900
7   1971-01-13  99.9000
8   1971-01-14  99.8300

and so on
我正在尝试构建一个新的df,它应该如下所示:

     1994-02-04 1994-03-22 1994-04-18 ...
-2
-1
 0
 1
 2
第“0”行中“1994-02-04”列的值应为自第一个df(“USD_I”列)起该日期的值。行'-1'的值应为前一天的值,行'1'的值应为第二天的值,依此类推。简单地说,这些列是列表中的值,新df的值是第一个df中的数据片段

我在第二天尝试这样做,但我仍然在索引方面出错,无法在线找到解决方案。我将非常感谢任何帮助和提示如何处理它


我尝试使用('result'是最终df的名称):

这给了我一个以日期为列名的数据框,这很好,但第一行只有第一个日期的值,其他的是NaN,所以我删除了整行并尝试:

for i in result:
    for x in range(-2,3):
        result.loc[x,i] = df.loc[(df[df['Date']==i].index.values+x),'USD_I']

但这给了我ValueError:与Series不兼容的索引器。

我建议研究pandas pivot方法()。这将允许您将日期设置为列名。从那里,您可以使用pd.timedelta()获取前一天或当前日期后的日期时间。然后,您可以使用这个新的datetime对象重新索引到数据帧中,以获得正确的日期


我相信通过使用shift方法可能有一种更简单的方法来实现这一点,但这假设您每天都有一个值,并且它们是有序的。

我建议您研究pandas pivot方法()。这将允许您将日期设置为列名。从那里,您可以使用pd.timedelta()获取前一天或当前日期后的日期时间。然后,您可以使用这个新的datetime对象重新索引到数据帧中,以获得正确的日期


我相信使用shift方法可能有一种更简单的方法来实现这一点,但这是假设你每天都有一个值,并且它们是有序的。

好的,完成了。我列了一个索引编号列表,然后就顺利了。我以前尝试过,但我的错误是使用list.append而不是list.extend。谢谢你的支持。

好了,结束了。我列了一个索引编号列表,然后就顺利了。我以前尝试过,但我的错误是使用list.append而不是list.extend。感谢您的支持。

您遇到了什么错误?您是否使用
datetime.timedelta
添加/减去天数?在输出数据框中,值应该是什么?它看起来只是一个索引和columns@Marmaduke我已经在文章中添加了更多详细信息,以及我尝试这样做的方式。@第“0”行中“1994-02-04”列的MattR值应该是从第一个df(“USD_i”列)开始的该日期的值。行'-1'的值应为前一天的值,行'1'的值应为第二天的值,依此类推。简单地说,这些列是列表中的值,新df的值是第一个df中的数据片段。您得到了什么错误?您是否使用
datetime.timedelta
添加/减去天数?在输出数据框中,值应该是什么?它看起来只是一个索引和columns@Marmaduke我已经在文章中添加了更多详细信息,以及我尝试这样做的方式。@第“0”行中“1994-02-04”列的MattR值应该是从第一个df(“USD_i”列)开始的该日期的值。行'-1'的值应为前一天的值,行'1'的值应为第二天的值,依此类推。简单地说,这些列是列表中的值,新df的值是第一个df中的数据片段。我在最后一个循环中的某个地方犯了错误,不管我使用的是天数还是索引值。我将循环的最后一行更改为result.loc[x,I]=df[df['Date']==(I+dt.timedelta(days=x))['USD_I']但它给了我ValueError:与序列不兼容的索引器。你知道我做错了什么吗?我完全被它迷住了。我在最后一个循环的某个地方犯了错误,不管我使用的是天数还是索引值。我将循环的最后一行更改为result.loc[x,I]=df[df['Date']==(I+dt.timedelta(days=x))['USD_I']但它给了我ValueError:与序列不兼容的索引器。你知道我做错了什么吗?我完全被它迷住了。
for i in result:
    for x in range(-2,3):
        result.loc[x,i] = df.loc[(df[df['Date']==i].index.values+x),'USD_I']