提取并汇总时间段内的总数

时间:2018-07-17 11:35:10

标签: python pandas datetime

我有一个降雨数据集,降雨值与降雨发生的时间(分钟)和日期相关联,如果没有降雨,则不会记录任何内容。因此,大风暴的某些日子可能有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,依此类推。

据我了解,这不仅仅是简单的分组和。可能是如果我要提取每日总计(我已经做过),但是这似乎要复杂得多。关于我如何完成此任务有什么想法?

非常感谢您的任何想法和建议!

2 个答案:

答案 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()

显示每个系列的非零值以进行检查。

10分钟

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

1小时

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

3小时

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

enter image description here