使用Pandas选择月份的某一天作为日期范围的起始日期
我有一个按时间序列索引的数据集。我想获取从18号开始到13天后的所有数据,也就是从18号到31号的数据。例如:
df = pd.DataFrame.from_records([
(datetime(2013, 2, 16),2),
(datetime(2013, 2, 18),5), #
(datetime(2013, 2, 19),6), #
(datetime(2013, 3, 1), 7), #
(datetime(2013, 3, 17),1),
(datetime(2013, 3, 20),3), #
(datetime(2013, 3, 25),4), #
(datetime(2013, 4, 1), 8)],
columns=["time_slot", "data"],
index=["time_slot"])
只有用#
标记的行应该被包含在内。
这样做:
days = df.ix[df.index.day == 18].index
for d in days:
print df.ix[d:d+timedelta(days=13)]
只会打印出前面三个标记的记录。有没有办法在不明确指定月份的情况下,根据日期范围来选择数据呢?
2 个回答
1
那这样怎么样呢
df[df.index.day>=18]
2
我不太明白你为什么要这样做,但我想在Pandas中玩玩日期,所以试了一下。我对Pandas还很陌生,发现通过创建一个额外的列来处理日期索引是最简单的。肯定有人能做得更简洁。
我觉得下面的代码可以满足你的需求:
from datetime import *
import pandas as pd
from_day = 15
plus_days = 18
df = pd.DataFrame.from_records([
(datetime(2013, 2, 16),2),
(datetime(2013, 2, 18),5), #
(datetime(2013, 2, 19),6), #
(datetime(2013, 3, 1), 7), #
(datetime(2013, 3, 17),1),
(datetime(2013, 3, 20),3), #
(datetime(2013, 3, 25),4), #
(datetime(2013, 4, 1), 8)],
columns=["time_slot", "data"],
index=["time_slot"])
df.insert(0,'days',df.index)
df.days = df.days.apply(lambda x: x.day)
然后你可以用你的不等式来查询这个数据框:
df[(df['days']>=from_day) & (df['days'] < from_day + plus_days)].data
显然,当从某一天设置为15,加上的天数设置为18时,结果总是从第15天开始的所有天数,但我认为这个方法在一般情况下也能工作。
更新
使用我的从某一天和加的天数(不过加的天数设置为你要求的13),下面的代码包含了2013年2月1日至3日的日期,正如你所希望的那样:
df.insert(0,'adjusted_day',df.index)
df.adjusted_day = df.adjusted_day.apply(lambda x: (x + timedelta(days=-plus_days)).day)
df[(df.index.day>=from_day) | ((df.adjusted_day <=from_day) & (df.adjusted_day >=from_day-plus_days))]