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

时间:2019-04-21 18:36:45

标签: python dataframe

我的数据框具有许多天的时间序列数据。我想执行日常计算并将其存储在同一列中。

例如:

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

如何实现此输出?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

尽管我看到您找到了答案,但是您的解决方案看起来非常难看。让我向您展示一种更清洁,更像熊猫的方法。

首先,您必须创建一个名为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

现在您可以使用https://gist.github.com/MaZderMind/12fe3b370e654f31ea22aaa540f5a741函数将一列中的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循环和硬编码的字符串。