当前位置: 首页 > 知识库问答 >
问题:

在Pandas数据框中编写一个for循环来计算一年中的每一天的公式[重复]

吴松
2023-03-14

我是Python'for'循环的新手,我正在尝试在数据框中计算一年中每一天的公式。我使用的公式如下:gdd=(((row_minrow_max)/2)-7)。为了进一步解释,我需要找到每天的最高和最低温度,将它们除以2,然后从该商中减去7。

以下是数据:

import pandas as pd

df = {'Date': ['2021-01-01', '2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02', '2021-01-02','2021-01-03','2021-01-03','2021-01-03'],
     'Time': ['12:00:00 AM', '1:00:00 AM', '2:00:00 AM','12:00:00 AM', '1:00:00 AM', '2:00:00 AM','12:00:00 AM', '1:00:00 AM', '2:00:00 AM'],
     'TEMP': ['3', '1', '12','4', '8', '7','9', '12', '8']}

df = pd.DataFrame(df)

将“日期”列转换为日期时间格式:

# Convert to datetime format
df['Date']=pd.to_datetime(df['Date'])

# Add column for day of year
df['dayofyear'] = df['Date'].dt.dayofyear
df

输出显示已经正确分配了一年中的某一天。

下面是我正在尝试的循环:

for day in df['dayofyear']:
    temp = df['TEMP']
    row_min = temp.min()
    row_max = temp.max()
    gdd = (((row_min + row_max) / 2) - 7)

但是,将产生以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [83], in <cell line: 15>()
     17 row_min = temp.min()
     18 row_max = temp.max()
---> 19 gdd = (((row_min + row_max) / 2) - 7)

TypeError: unsupported operand type(s) for /: 'str' and 'int'

如何正确编写此循环

共有2个答案

狄宇
2023-03-14

这里有一种不用for循环的方法

df['Date']=pd.to_datetime(df['Date'])

# Add column for day of year
df['dayofyear'] = df['Date'].dt.dayofyear

df['TEMP'] =df['TEMP'].astype(int)


df['gdd']=df.groupby(['dayofyear'])['TEMP'].transform(
    lambda x:  ((x.max()+ x.min())/2) * 7 )
df


    Date        Time         TEMP   gdd     dayofyear
0   2021-01-01  12:00:00 AM     3   45.5    1
1   2021-01-01  1:00:00 AM      1   45.5    1
2   2021-01-01  2:00:00 AM     12   45.5    1
3   2021-01-02  12:00:00 AM     4   42.0    2
4   2021-01-02  1:00:00 AM      8   42.0    2
5   2021-01-02  2:00:00 AM      7   42.0    2
6   2021-01-03  12:00:00 AM     9   70.0    3
7   2021-01-03  1:00:00 AM     12   70.0    3
8   2021-01-03  2:00:00 AM      8   70.0    3

或者,如果你不想把TEMP转换成int,这里有一种方法

df['Date']=pd.to_datetime(df['Date'])

# Add column for day of year
df['dayofyear'] = df['Date'].dt.dayofyear


# convert the series to int prior to taking the max() or min()
df['gdd']=df.groupby(['dayofyear'])['TEMP'].transform(
    lambda x:  ((x.astype(int).max()+ x.astype(int).min())/2) * 7 )
df
端木冷勋
2023-03-14

你想要:

# ensure data in numeric
df['TEMP'] = pd.to_numeric(df['TEMP'])

# group, get min/max and compute transformation in a vectorial way
g = df.groupby('dayofyear')['TEMP']
df['gdd'] = g.transform('max').add(g.transform('min')).div(2).sub(7)

输出:

        Date         Time  TEMP  dayofyear  gdd
0 2021-01-01  12:00:00 AM     3          1 -0.5
1 2021-01-01   1:00:00 AM     1          1 -0.5
2 2021-01-01   2:00:00 AM    12          1 -0.5
3 2021-01-02  12:00:00 AM     4          2 -1.0
4 2021-01-02   1:00:00 AM     8          2 -1.0
5 2021-01-02   2:00:00 AM     7          2 -1.0
6 2021-01-03  12:00:00 AM     9          3  3.0
7 2021-01-03   1:00:00 AM    12          3  3.0
8 2021-01-03   2:00:00 AM     8          3  3.0
 类似资料:
  • 我想要一个循环,检查当前的月,12个月在未来和4个月在过去。

  • 问题内容: 如何使用javascript从1-366计算一年中的某一天?例如: 1月3日 应该是 3 月3 日 。 2月1日 应该是 32 。 问题答案: 在OP的编辑之后: 编辑:上面的代码会失败时,是3月26日和10月29日之间的日期的时间是凌晨1点之前(如零时59分59秒)。这是因为该代码未考虑夏令时。

  • 问题内容: 如果我有这样的表: 我可以在Qlik中提出5个唯一的hID。我该如何在Python中使用Pandas数据框?还是一个numpy数组?同样,如果这样做,我将在Qlik中得到8。在大熊猫中做这件事的等效方法是什么? 问题答案: 计算不同的值,使用: 仅计算非空值,请使用: 计算包括空值在内的总值,请使用属性: 使用布尔索引: 或使用: 输出:

  • 我需要在每个循环中生成唯一的id,而不是"城市选择" 我如何在这里生成它? 我需要一些像这样的ID: 输出:

  • 我的数据如下: 我想计算每个小组自上一个日期以来每年经过的天数。当我尝试这样做时,输出不是对数据进行分组。例如,输出会将组 B 2019-07-15 和组 A 2019-08-21 之间的天数计算为负值,而不是计算自每个日期 WITHIN 组以来经过的天数。 我尝试了以下代码,这导致了我在上面描述的问题: 提前谢谢!

  • 问题内容: 我需要在给定年份(例如2011年)的每一天的每一小时,在命令行上获取/打印,但我一直在用Java编写代码。 有人编码过这个问题吗? 问题答案: 这应该工作: 注意,例如,输出中的这个细微之处: