在时间序列数据帧中,如何执行日常计算并存储在同一列中



我的数据帧包含许多天的时间序列数据。我想执行每日计算并将它们存储在同一列中。

例如:

Dataframe
----------------------------
Timeseries              A 
2019-01-24 14:03:00    10 
2019-01-24 14:04:00    20
2019-01-24 14:05:00    15
2019-01-25 14:06:00     9
2019-01-25 14:07:00    18
2019-01-25 14:08:00    12

我想创建一个名为每单位 A puA的新列,其中包含值 A/Amax,其中 Amax 是当天 A 中的最大值。我的代码片段如下:

dates_list = ['2019-01-24','2019-01-25']  #Extract uniques dates list
    for i in dates_list:
        df['puA'] = df['A'].loc[i]/df['A'].loc[i].max()

我目前的输出是:

Timeseries             nA            puA
2019-01-24 14:03:00    10            NaN
2019-01-24 14:04:00    20            NaN
2019-01-24 14:05:00    15            NaN
2019-01-25 14:06:00    n9     9/18 = 0.5
2019-01-25 14:07:00    18    18/18 = 1.0
2019-01-25 14:08:00    12    12/18 = 0.6

它只存储最后的日期,而不是全部离开它们。

我希望输出为

Timeseries              A     puA
2019-01-24 14:03:00    10    0.50 
2019-01-24 14:04:00    20    1.00
2019-01-24 14:05:00    15    0.75
2019-01-25 14:06:00     9    0.50
2019-01-25 14:07:00    18    1.00
2019-01-25 14:08:00    12    0.60

如何实现此输出?

虽然我看到你已经找到了答案,但你的解决方案似乎很丑陋。让我向您展示一种更干净,更像熊猫的方法。

首先,您必须创建一个名为date的新列。

df['date'] = df['Timeseries'].dt.date ##
print(df)
          Timeseries   A        date
0 2019-01-24 14:03:00  10  2019-01-24
1 2019-01-24 14:04:00  20  2019-01-24
2 2019-01-24 14:05:00  15  2019-01-24
3 2019-01-25 14:06:00   9  2019-01-25
4 2019-01-25 14:07:00  18  2019-01-25
5 2019-01-25 14:08:00  12  2019-01-25

现在在日期列上应用分组依据函数并找到每个日期的最大值

grouped_df = df.groupby(df['date']).max().reset_index()[['date', 'A']]
grouped_df.columns = ['date', 'max_A']
print(grouped_df)
         date  max_A
0  2019-01-24     20
1  2019-01-25     18

现在,您可以使用 df.merge(( 函数在列上联接 2 个数据帧

merged_df = df.merge(grouped_df, on='date')
print(merged_df)
           Timeseries   A        date  max_A
0 2019-01-24 14:03:00  10  2019-01-24     20
1 2019-01-24 14:04:00  20  2019-01-24     20
2 2019-01-24 14:05:00  15  2019-01-24     20
3 2019-01-25 14:06:00   9  2019-01-25     18
4 2019-01-25 14:07:00  18  2019-01-25     18
5 2019-01-25 14:08:00  12  2019-01-25     18

现在,对于数据帧中的每一行,您已经Amax_A 。只需通过除法创建一个新列A/max_A

merged_df['puA'] = merged_df['A']/merged_df['max_A']
print(merged_df)
           Timeseries   A        date  max_A       puA
0 2019-01-24 14:03:00  10  2019-01-24     20  0.500000
1 2019-01-24 14:04:00  20  2019-01-24     20  1.000000
2 2019-01-24 14:05:00  15  2019-01-24     20  0.750000
3 2019-01-25 14:06:00   9  2019-01-25     18  0.500000
4 2019-01-25 14:07:00  18  2019-01-25     18  1.000000
5 2019-01-25 14:08:00  12  2019-01-25     18  0.666667

这是我的朋友是熊猫的方式。它不涉及任何丑陋的 for 循环和硬编码字符串。

经过反复试验,我找到了答案:

dates_list = ['2019-01-24','2019-01-25']  #Extract uniques dates list
    for i in dates_list:
        rows_of_interest = [ind for ind, a in enumerate(df.index) if a.strftime("%Y-%m-%d") in i]
        df['puA'][rows_of_interest] = df['A'].loc[i]/df['A'].loc[i].max()

我的输出是:

Timeseries              A     puA
2019-01-24 14:03:00    10    0.50 
2019-01-24 14:04:00    20    1.00
2019-01-24 14:05:00    15    0.75
2019-01-25 14:06:00     9    0.50
2019-01-25 14:07:00    18    1.00
2019-01-25 14:08:00    12    0.60

最新更新