【问题标题】:Climatology frequencies and duration气候学频率和持续时间
【发布时间】:2021-09-25 08:25:25
【问题描述】:

我有一个 10 年的气候数据集如下。

dt               T          P
01-01-2010        3          0
02-01-2010        5          11
03-01-2010       10          50
....
31-12-2020       -1          0

我想估计每个月 T 和 P 连续大于 0 三天或更长时间的总天数

我希望这些列作为输出:

month    Number of days/DurationT&P>0     T   P  

我从未在 python 中使用过循环,当数据必须首先按月和年分组然后应用条件时,我似乎能够编写一个简单的循环,除此之外什么都没有。非常感谢有关循环构造的任何提示。

A= dataset
A['dt'] = pd.to_datetime(A['dt'], format='%Y-%m-%d')

for column in A [['P', 'T']]:
    for i in range (len('P')):
        if i > 0:
           P.value_counts()
             print(i)
    for j in range (len ('T')):
       if i > 0:
       T.value_counts()
           print(j)

【问题讨论】:

  • 您能否改写标题以专注于您遇到的特定技术问题,而不是您遇到该特定问题时所在的问题域?

标签: python pandas loops conditional-statements


【解决方案1】:

这是一种非常幼稚的方法,您可以通过简单地遍历行来设置它:

df['valid'] = (df['T'] > 0) & (df['P'] > 0)

def count_total_days(df):
    i = 0
    total = 0
    for idx, row in df.iterrows():
        if row.valid:
            i += 1
        elif not row.valid:
            if i >= 3:
                total += i
            i = 0
    
    return total

由于您需要每月一次,因此您首先必须创建新的月份和年份列来分组:

df['month'] = df['dt'].dt.month
df['year'] = df['dt'].dt.year

for date, df_subset in df.groupby(['month', 'year']):
    count_total_days(df_subset)

【讨论】:

  • 您好,非常感谢您的回答。我可以进一步问,如何将每月 T&P > 0 连续三天或更长时间的实例相加?因为我通过这段代码得到的是 T&P 是否都 > 0 对于特定日期分组的月、年。而不是连续三天或更长时间 T&P>0 的总实例。
  • 这提供了 T&P>0 的总天数,仅计算连续 3 天以上的天数。如果不是计算总天数,而是想要连续的总连续数,请将行 total += i 更改为 total += 1(这将增加一个计数而不是 i 天数)。
  • 你好,我尝试了你的建议,它产生了完全相同的结果。请问是否可以计算 T&P 连续三天或更长时间保持>0 的实例总数,然后将其输出到一个名为 total 的新列?而不是真假。非常感谢。
【解决方案2】:

您可以使用resamplesum 获取条件为真的每个日期的总和。

import pandas as pd

dt = ["01-01-2010", "01-02-2010","01-03-2010","01-04-2010", "03-01-2010",'12-31-2020']
t=[3,66,100,5,10,-1]
P=[0,77,200,11,50,0]

A=pd.DataFrame(list(zip(dt, t,P)),
               columns =['dtx', 'T','P'])

A['dtx'] = pd.to_datetime(A['dtx'], format='%m-%d-%Y')
A['Mask']=A.dtx.diff().dt.days.ne(1).cumsum()
dict_freq=A['Mask'].value_counts().to_dict()
newdict = dict((k, v) for k, v in dict_freq.items() if v >= 3)
A=A[A['Mask'].isin(list(newdict.keys()))]
A['Mask']=(A['T'] >= 1) & (A['P'] >= 1)
df_summary=A.query('Mask').resample(rule='M',on='dtx')['Mask'].sum()

哪些产品

2010-01-31    3

【讨论】:

  • 这个解决方案没有考虑到条件T>0 & P>0只计算连续三天的要求。
  • @pciunkiewicz,感谢您的评论,已编辑
  • 您仍然需要按月和年进行分组,如问题最后一段所述。
  • 嗨 Balandongiv,感谢您的帮助。该代码确实提供了每月 T&P >0 的总天数,但不提供仅 T&P 连续 >0 的那些天的实例/频率
  • 不提供仅连续三天 T&P >0 的那些天的实例/频率。
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多