Python/Pandas -- 将行号转换为小时,然后切片



我有一个数据帧,我已经用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

相关内容

最新更新