使用Pandas选择月份的某一天作为日期范围的起始日期

-1 投票
2 回答
906 浏览
提问于 2025-04-20 11:35

我有一个按时间序列索引的数据集。我想获取从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))]

撰写回答