所以眼前的问题很简单,但很棘手。我有3个变量startdate, enddate
和一个整数i=250
。 df的索引是DateTimeIndex。存在该问题是因为我需要同时使用.loc和.iloc。
我发现了一些方法。但这并没有使我成为解决问题的“完美方法”。也许有人遇到过同样的问题,并以很好的方式解决了这个问题,或者有人可以确认这实际上是“快速”的。
我当前的解决方案:
index_startdate = list(df.index.date.astype(str)).index(startdate)
df2 = (df.loc[:enddate]).iloc[(index_startdate-250):]
我也想到了这一点:
df2 = pd.concat([(df.loc[:startdate]).iloc[-250:],df.loc[startdate:enddate]])
预先感谢
答案 0 :(得分:0)
对于标签位置,您只能使用带有开始日期时间减去的DataFrame,loc
解决方案,或者带有DataFrame.iloc
的Index.get_loc
解决方案来标记位置:
示例:
rng = pd.date_range('2017-04-03', periods=10)
df = pd.DataFrame({'a': range(10)}, index=rng)
print (df)
a
2017-04-03 0
2017-04-04 1
2017-04-05 2
2017-04-06 3
2017-04-07 4
2017-04-08 5
2017-04-09 6
2017-04-10 7
2017-04-11 8
2017-04-12 9
startdate = '2017-04-07'
enddate = '2017-04-11'
#in real data change 2 to 250
s = pd.Timestamp(startdate) - pd.offsets.DateOffset(days=2)
df2 = df.loc[s:enddate]
print (df2)
a
2017-04-05 2
2017-04-06 3
2017-04-07 4
2017-04-08 5
2017-04-09 6
2017-04-10 7
2017-04-11 8
#in real data change 2 to 250
s = df.index.get_loc(startdate) - 2
#slicing with iloc is exclusive of its endpoint, so added 1
e = df.index.get_loc(enddate) + 1
df2 = df.iloc[s:e]
print (df2)
a
2017-04-05 2
2017-04-06 3
2017-04-07 4
2017-04-08 5
2017-04-09 6
2017-04-10 7
2017-04-11 8