【问题标题】:Performing mathematical operation comparing two datetime dataframes执行比较两个日期时间数据帧的数学运算
【发布时间】:2022-06-19 13:18:40
【问题描述】:

我有两个不同的数据框。 df1=

index Time
0   2009-09-13 01:17:00
1   20009-09-13 02:17:00
2   2009-09-13 03:17:00
3   2009-09-13 04:17:00
4   2009-09-13 05:17:00

............ 这是一个时间序列数据,每小时间隔总共 10 天。 和 df2=

    Selling Time          Buying Time                      sell     buy
0   2009-09-13 01:17:00   2009-09-13 04:35:00               1        -1
1   2009-09-13 04:20:00   2009-09-13 04:45:00               27       -3
2   2009-09-14 02:25:00   2009-09-15 01:17:00               1        -2
3   2009-09-15 05:33:00   2009-09-16 01:35:00               100      -5

.......

此处,特定商品的买卖列以美元为单位。该物品的买卖时间不同。

我想通过“df2”迭代“df1”每小时时间数据,并计算我在每个特定小时拥有的当前货币价值(将前一小时价值相加)。例如,在 2009-09-13 01:17:00,我卖出了 1 美元,当时什么都没买。因此,我想创建一个新数据集,其中 2009-09-13 01:00:00 的值为 1。因此,对于 2009 年的日期,02:00:00 和 03:00:00 将保持 1 -09-13.

04 小时内我卖出了 27 美元,而前一小时我卖出了 1 美元。但买了 (-1-3)= -4USD。因此,对于 2009-09-13 04:00:00,新值将是 (27+1)-4= 24USD 等等。

输出应如下所示:

index Time                    Present Value
0   2009-09-13 01:00:00       1
1   20009-09-13 02:00:00      1
2   2009-09-13 03:00:00       1
3   2009-09-13 04:00:00       24  

……以此类推,直到df1的最后一个日期和时间。

请注意,数据集“df1”的所有“卖出”和“买入”值应在同一小时内相加。

我可以理解 for 循环的计算,但很难用 datetime 构建一个 for 循环。

【问题讨论】:

    标签: python pandas datetime for-loop


    【解决方案1】:

    我会换一种方式来考虑:随着时间的推移,您的价值是一个阶跃函数。我们可以使用一个名为staircase 的python 包来提供帮助。它基于 pandas 和 numpy 构建。

    设置

    df1 = pd.DataFrame(
        {
            "time": [
                pd.Timestamp("2009-09-13 01:00:00"),
                pd.Timestamp("2009-09-13 02:00:00"),
                pd.Timestamp("2009-09-13 03:00:00"),
                pd.Timestamp("2009-09-13 04:00:00"),
                pd.Timestamp("2009-09-13 05:00:00"),
            ]
        }
    )
    
    df2 = pd.DataFrame(
        {
            "sell_time":[
                pd.Timestamp("2009-09-13 01:17:00"),
                pd.Timestamp("2009-09-13 04:20:00"),
                pd.Timestamp("2009-09-14 02:25:00"),
                pd.Timestamp("2009-09-15 05:33:00"),
            ],
            "buy_time":[
                pd.Timestamp("2009-09-13 04:35:00"),
                pd.Timestamp("2009-09-13 04:45:00"),
                pd.Timestamp("2009-09-15 01:17:00"),
                pd.Timestamp("2009-09-16 01:35:00"),
            ],
            "sell":[1,27,1,100],
            "buy":[-1,-3,-2,-5]
        }
    )
    

    解决方案

    import staircase as sc
    
    # setup step function
    sf = sc.Stairs().layer(df2["sell_time"], value=df2["sell"]).layer(df2["buy_time"], value=df2["buy"])
    
    # you can plot it
    sf.plot()
    

    # sample the step function at particular values
    sf(df1["time"], include_index=True)
    

    这为您提供了以下 pandas Series,它与 step 函数的值相匹配

    time
    2009-09-13 01:00:00     0
    2009-09-13 02:00:00     1
    2009-09-13 03:00:00     1
    2009-09-13 04:00:00     1
    2009-09-13 05:00:00    24
    dtype: int64
    

    注意: 我是楼梯的创造者。如果您有任何反馈或问题,请随时与我们联系。

    【讨论】:

    • 太棒了!这个方法对我有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多