【问题标题】:how to get the shifted index value of a dataframe in Pandas?如何在 Pandas 中获取数据框的移位索引值?
【发布时间】:2016-10-15 15:57:51
【问题描述】:

考虑下面的简单示例:

date = pd.date_range('1/1/2011', periods=5, freq='H')

df = pd.DataFrame({'cat' : ['A', 'A', 'A', 'B',
                         'B']}, index = date)
df
Out[278]: 
                    cat
2011-01-01 00:00:00   A
2011-01-01 01:00:00   A
2011-01-01 02:00:00   A
2011-01-01 03:00:00   B
2011-01-01 04:00:00   B

我想创建一个包含索引滞后/领先值的变量。是这样的:

df['index_shifted']=df.index.shift(1)

例如,在2011-01-01 01:00:00 时,我希望变量index_shifted2011-01-01 00:00:00

我该怎么做? 谢谢!

【问题讨论】:

  • df.index 给etc etc '2016-06-13 16:29:00'], dtype='datetime64[ns]', length=2471070, freq=None) 这是个问题吗?

标签: python pandas dataframe date-range shift


【解决方案1】:

我认为你需要Index.shift-1

df['index_shifted']= df.index.shift(-1)
print (df)
                    cat       index_shifted
2011-01-01 00:00:00   A 2010-12-31 23:00:00
2011-01-01 01:00:00   A 2011-01-01 00:00:00
2011-01-01 02:00:00   A 2011-01-01 01:00:00
2011-01-01 03:00:00   B 2011-01-01 02:00:00
2011-01-01 04:00:00   B 2011-01-01 03:00:00

对我来说,它可以在没有 freq 的情况下工作,但在实际数据中可能是必要的:

df['index_shifted']= df.index.shift(-1, freq='H')
print (df)
                    cat       index_shifted
2011-01-01 00:00:00   A 2010-12-31 23:00:00
2011-01-01 01:00:00   A 2011-01-01 00:00:00
2011-01-01 02:00:00   A 2011-01-01 01:00:00
2011-01-01 03:00:00   B 2011-01-01 02:00:00
2011-01-01 04:00:00   B 2011-01-01 03:00:00

编辑:

如果DatetimeIndexfreqNone,则需要将freq 添加到shift

import pandas as pd

date = pd.date_range('1/1/2011', periods=5, freq='H').union(pd.date_range('5/1/2011', periods=5, freq='H'))


df = pd.DataFrame({'cat' : ['A', 'A', 'A', 'B',
                         'B','A', 'A', 'A', 'B',
                         'B']}, index = date)

print (df.index)
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 01:00:00',
               '2011-01-01 02:00:00', '2011-01-01 03:00:00',
               '2011-01-01 04:00:00', '2011-05-01 00:00:00',
               '2011-05-01 01:00:00', '2011-05-01 02:00:00',
               '2011-05-01 03:00:00', '2011-05-01 04:00:00'],
              dtype='datetime64[ns]', freq=None)

df['index_shifted']= df.index.shift(-1, freq='H')
print (df)
                    cat       index_shifted
2011-01-01 00:00:00   A 2010-12-31 23:00:00
2011-01-01 01:00:00   A 2011-01-01 00:00:00
2011-01-01 02:00:00   A 2011-01-01 01:00:00
2011-01-01 03:00:00   B 2011-01-01 02:00:00
2011-01-01 04:00:00   B 2011-01-01 03:00:00
2011-05-01 00:00:00   A 2011-04-30 23:00:00
2011-05-01 01:00:00   A 2011-05-01 00:00:00
2011-05-01 02:00:00   A 2011-05-01 01:00:00
2011-05-01 03:00:00   B 2011-05-01 02:00:00
2011-05-01 04:00:00   B 2011-05-01 03:00:00

【讨论】:

    【解决方案2】:

    df['index_shifted']=df.index.shift(-1) 有什么问题?

    (真正的问题,不确定我是否遗漏了什么)

    【讨论】:

    • 我收到ValueError: Cannot shift with no freq
    • @Noobie:很奇怪,它在本地运行良好。 df.index.freq 的结果是什么?应该是<Hour>
    • 请看我上面的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2015-05-12
    • 2019-09-10
    • 2016-02-11
    • 1970-01-01
    • 2022-06-29
    • 2013-05-17
    相关资源
    最近更新 更多