使用Pandas选择日期作为日期范围的开始日期

时间:2014-09-08 14:06:14

标签: python pandas

我有一个时间序列索引的数据集。我想从数据中的行中获取18天到13天之后的所有日期数据。 E.g。

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 个答案:

答案 0 :(得分:2)

我不确定你为什么要这样做,但我想在熊猫中玩更多日期,所以试一试。我对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

很明显,将from_day设置为 15 ,plus_days 18 将始终导致从第15天开始的所有日期,但我认为这一般会有效。

更新

使用我的from_day和加号天数(但是你要求的加号天数设置为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))]

答案 1 :(得分:1)

怎么样

df[df.index.day>=18]