我有一个降雨数据集,降雨值与降雨发生的时间(分钟)和日期相关联,如果没有降雨,则不会记录任何内容。因此,大风暴的某些日子可能有100个读数,而有些日子却没有或只有一两个。下面的示例:
D M Y DAY Hr Min Tot
2 3 2002 2419 5 49 0.2
2 3 2002 2419 5 53 0.4
2 3 2002 2419 5 57 0.2
2 3 2002 2419 6 8 0.6
3 3 2002 2420 3 11 0.2
3 3 2002 2420 3 13 0.2
3 3 2002 2420 23 3 0.8
3 3 2002 2420 23 4 0.4
3 3 2002 2420 23 29 0.6
4 3 2002 2421 19 7 0.2
4 3 2002 2421 19 8 0.2
4 3 2002 2421 19 9 0.2
4 3 2002 2421 19 10 0.2
('Tot' is rainfall total)
此数据集大约有十年的时间,我需要将此数据转换为总计10分钟,1小时和3小时的总计,以便与另一个变量相关。例如,我需要能够提取出10分钟3/3/2002 23:00:00-23:10:00发生的总降雨量,即1.2,然后从3 / 3/2002 23:00:00等于1.8,依此类推。
据我了解,这不仅仅是简单的分组和。可能是如果我要提取每日总计(我已经做过),但是这似乎要复杂得多。关于我如何完成此任务有什么想法?
非常感谢您的任何想法和建议!
答案 0 :(得分:2)
您可以使用以下内容生成三个数据框/系列
to_datetime
创建一个具有datetime dtype的列df['date'] = pd.to_datetime(df['Y'].astype(str)+'-'+df['M'].astype(str)+'-'+df['D'].astype(str)+' '+df['Hr'].astype(str)+':'+df['Min'].astype(str)+':00')
resample
日期,间隔为10T,1H和3H,sum
df_10T = df.resample('10T', on='date')['Tot'].sum()
df_1H = df.resample('1H', on='date')['Tot'].sum()
df_3H = df.resample('3H', on='date')['Tot'].sum()
df_10T[df_10T.ne(0)]
date
2002-03-02 05:40:00 0.2
2002-03-02 05:50:00 0.6
2002-03-02 06:00:00 0.6
2002-03-03 03:10:00 0.4
2002-03-03 23:00:00 1.2
2002-03-03 23:20:00 0.6
2002-03-04 19:00:00 0.6
2002-03-04 19:10:00 0.2
Name: Tot, dtype: float64
df_1H[df_1H.ne(0)]
date
2002-03-02 05:00:00 0.8
2002-03-02 06:00:00 0.6
2002-03-03 03:00:00 0.4
2002-03-03 23:00:00 1.8
2002-03-04 19:00:00 0.8
Name: Tot, dtype: float64
df_3H[df_3H.ne(0)]
date
2002-03-02 03:00:00 0.8
2002-03-02 06:00:00 0.6
2002-03-03 03:00:00 0.4
2002-03-03 21:00:00 1.8
2002-03-04 18:00:00 0.8
Name: Tot, dtype: float64
答案 1 :(得分:0)
要做的第一件事是将日期转换为datetime对象。之后,您可以使用时间增量对数据帧进行切片。
import datetime
import pandas as pd
import numpy as np
df = pd.read_clipboard()
timestep = datetime.timedelta(hours=3)
dates = [datetime.datetime(Y, M, D, h, m) for Y, M, D, h, m in zip(df.Y, df.M, df.D, df.Hr, df.Min)]
df.index = dates
start = df.index.min()
steps = int(np.ceil((df.index.max() - start) / timestep))
bins = [start + i * timestep for i in range(steps)]
data = [df[bins[i]: bins[i+1]].Tot.sum() for i in range(int(steps-1))]
result = pd.DataFrame({"Total": data}, bins[:-1])