python - datetimeindex 之前的天数(同时使用 .loc 和 .iloc)
问题描述
所以手头的问题很简单,但很棘手。我有 3 个变量startdate, enddate
和一个整数i=250
。df 的索引是 DateTimeIndex。存在问题是因为我需要同时使用 .loc 和 .iloc 。
- 我有一个在开始日期之前开始并在结束日期之后结束的数据框。
- 我希望在我的开始日期前 250 天开始到我的结束日期有一个熊猫数据框
我找到了一些方法来做到这一点。但它并没有让我觉得解决它的“完美方式”。也许有人遇到过同样的问题,并以一种很好的方式解决了它,或者也许有人可以确认这实际上是“快速”的。
我目前的解决方案:
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]])
提前致谢
解决方案
您只能使用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
推荐阅读
- tfs - 是否有隐藏/显示工作项(继承过程)中的字段的选项?
- java - Spring boot + tomcat 8.5 + mongoDB,AsyncRequestTimeoutException
- powerbi - 在计算另一张卡时使用一张卡的价值
- apache-spark - 如果输入 RDD 的大小超过内存容量,Spark 默认会将多余的数据存储到磁盘
- mysql - Mysql:如何合并多行以仅返回一行
- opengl - 预乘 alpha 混合的问题
- c# - SaveChanges() 之后的“DELETE 语句与 REFERENCE 约束 EF 核心冲突”
- linux - 在 bash 中的目录名称中使用逗号卷曲请求
- solr - 从 solr 获取记录不会更新 data-import.xml 文件中的 id
- performance - “str”对象没有属性“h264”