首页 > 解决方案 > datetimeindex 之前的天数(同时使用 .loc 和 .iloc)

问题描述

所以手头的问题很简单,但很棘手。我有 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]])

提前致谢

标签: pythonstringpandasindexinginteger

解决方案


您只能使用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

推荐阅读