我有一个数据帧,我已经用Pandas读到了Python中,如下所示:
>>> df
id temp
0 1 272.53702
1 2 272.41101
2 3 272.18503
3 4 271.79102
4 5 271.33701
5 6 270.86200
6 7 270.41501
7 8 269.97501
8 9 269.56201
9 10 269.18802
...
id
字段表示从 1989 年的第一个小时(1989 年 1 月 1 日午夜)到 2010 年最后一个小时的每一小时。我的目标是从表示 2002 年 5 月 1 日至 2006 年 11 月 20 日温度的temp
列中提取一个列表,然后使用 Scipy 的样条插值来拟合该列表。我的问题 - 将id
转换为日期时间,然后切片以获得我想要的适当日期范围的最有效方法是什么?
谢谢。
您可以使用日期算术来确定哪些id
值对应于要查找的开始和结束日期,然后使用loc
选择关联的温度。 这可能比将所有id
值转换为日期然后切片更快。
start = 24*(pd.to_datetime('2002-05-01') - pd.to_datetime('1989-01-01')).days
end = 24*(pd.to_datetime('2006-11-20') - pd.to_datetime('1989-01-01')).days - 1
temp_values = df.loc[df['id'].between(start, end), 'temp'].values
"到 2006 年 11 月 20 日",我假设你的意思是截至但不包括 2006 年 11 月 20 日。 如果你想要通过 20 日的数据,只需在 end
的计算中使用 21 日而不是 20 日。我从end
中减去一个,以获得计算中日期之前一天的最后一小时,因为不包括计算中使用的日期。
这基本上是你需要使用的:
>>> from datetime import datetime, timedelta
>>> print datetime(1989, 1, 1)
1989-01-01 00:00:00
>>> print datetime(1989, 1, 1) + timedelta(hours=5)
1989-01-01 05:00:00
我建议只添加一个datetime
列,这将允许您传递datetime
对象以供选择:
In [162]:
df['date'] = dt.datetime(1989,1,1) + pd.TimedeltaIndex(df['id'], 'h')
df
Out[162]:
id temp date
0 1 272.53702 1989-01-01 01:00:00
1 2 272.41101 1989-01-01 02:00:00
2 3 272.18503 1989-01-01 03:00:00
3 4 271.79102 1989-01-01 04:00:00
4 5 271.33701 1989-01-01 05:00:00
5 6 270.86200 1989-01-01 06:00:00
6 7 270.41501 1989-01-01 07:00:00
7 8 269.97501 1989-01-01 08:00:00
8 9 269.56201 1989-01-01 09:00:00
9 10 269.18802 1989-01-01 10:00:00
In [163]:
df.loc[df['date'] > '1989-01-01 06:00']
Out[163]:
id temp date
6 7 270.41501 1989-01-01 07:00:00
7 8 269.97501 1989-01-01 08:00:00
8 9 269.56201 1989-01-01 09:00:00
9 10 269.18802 1989-01-01 10:00:00