我有一个看起来像这样的pandas.Series
s = df['peak'].cumsum()
df['time_elapsed'] = df['time'].sub(df.groupby(['cycle', s])['time'].transform('first'))
我想在'2019-02-20'之前获得10个历史数据点,但无法弄清楚该怎么做。
我尝试过:
data =
'.INX'
Date
2019-01-29 2640.000000
2019-01-30 2681.005561
2019-01-31 2689.750205
2019-02-01 2751.544352
2019-02-04 2745.497311
2019-02-05 2767.970645
2019-02-06 2798.255994
2019-02-07 2707.690765
2019-02-08 2703.569149
2019-02-11 2640.521470
2019-02-12 2645.174583
2019-02-13 2644.231926
2019-02-14 2658.562312
2019-02-15 2658.030814
2019-02-19 2607.297839
2019-02-20 2553.135199
2019-02-21 2553.355821
2019-02-22 2514.045036
2019-02-25 2474.393290
2019-02-26 2423.449722
并且,也许并不奇怪,它没有起作用。我可以以一种聪明的方式来混合索引类型,还是必须获取索引并找到正确的日期?
答案 0 :(得分:2)
看起来“日期”是您的索引,因此如果索引还不是日期时间,您可以尝试将其转换为日期时间
df.index = pd.to_datetime(df.index)
那么您可以做:
df.loc[df.index < '2019-02-20'].tail(10)
或:
# extract 11 rows ending with the said date
# then taking top 10 rows
df.loc[:'2019-02-20'].tail(11).head(10)
注意:如果查询日期不在索引中,第二种方法似乎无法按预期工作。
输出:
'.INX'
Date
2019-02-05 2767.970645
2019-02-06 2798.255994
2019-02-07 2707.690765
2019-02-08 2703.569149
2019-02-11 2640.521470
2019-02-12 2645.174583
2019-02-13 2644.231926
2019-02-14 2658.562312
2019-02-15 2658.030814
2019-02-19 2607.297839
答案 1 :(得分:1)
使用Index.get_loc
来排名,因此可以使用DataFrame.iloc
:
p = data.index.get_loc('2019-02-20') + 1
df = data.iloc[p-10:p]
print (df)
.INX'
'Date
2019-02-06 2798.255994
2019-02-07 2707.690765
2019-02-08 2703.569149
2019-02-11 2640.521470
2019-02-12 2645.174583
2019-02-13 2644.231926
2019-02-14 2658.562312
2019-02-15 2658.030814
2019-02-19 2607.297839
2019-02-20 2553.135199