我有一个时间序列索引的数据集。我想从数据中的行中获取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)]
只打印前三个标记的记录。有没有办法根据月份选择日期范围而不明确指定月份?
答案 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]