簡體   English   中英

Python / Pandas —將行號轉換為小時,然后切片

[英]Python/Pandas — Converting row number to hour and then slicing

我有一個已通過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年最后一個小時的每小時。我的目標是從temp列中提取一個列表,該列表表示2002年5月1日至2006年11月20日的溫度,然后使用Scipy的樣條插值來擬合列表。 我的問題-將id轉換為datetime,然后切片以獲得我想要的適當日期范圍的最有效方法是什么?

謝謝。

您可以使用日期算術確定與您要查找的開始日期和結束日期相對應的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日”,我假設你的意思了,但不包括11月20日,2006年如果你想通過 20的數據,只是在計算使用21而不是20日end 我要從end減去1,以獲得計算中日期之前一天的最后一個小時,以不包括計算中使用的日期。

基本上,這是您需要使用的內容:

>>> 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM