【问题标题】:Dataframe Timestamp Filter for new/repeating value新/重复值的数据帧时间戳过滤器
【发布时间】:2019-08-17 12:08:02
【问题描述】:

我有被转换成两列数据框的数据。有一个Local Date_Local Time 列和一个Close 列。数据为股票/指数数据。

中的时间戳是按分钟计算的。示例

我的 df 样本

index   Local Date_Local Time   Close
0       2019-07-31 23:10:00     2980.38
1       2019-07-31 22:21:00     2980.38

并非每天的每一分钟都在索引中。由于这是交易数据,因此包括了晚上或早上的一些时间,但它没有每天的 0:00-23:59。我需要做两件事,但这个问题是关于第一件事的。

交易并非每天都在完全相同的时间开始或停止。该数据还涵盖了几个月,这意味着时区/时钟的变化可能会改变交易开始的相对时间。

但是,当交易停止时Close 将开始重复,当它开始时Close 将停止重复。

来自原始数据的样本(在 df 中,它看起来如上)

30-Jul-2019,15:32,"3,003.01"
30-Jul-2019,15:31,"3,004.43" <--- this is where trading began
29-Jul-2019,23:14,"3,020.97" <-- repeating price while market was closed
29-Jul-2019,22:21,"3,020.97"
29-Jul-2019,22:20,"3,020.97"

如果我假设 “收盘价在 4 分钟内不会一直保持到小数点后两位”,我该如何过滤这个数据框以包含每个交易日

- 从第一个新价格开始(例如上面的 @ 15:31)
- 到价格的最后一次变化,也就是重复超过 4 次的价格的第一个实例

(来自原始数据的示例)

29-Jul-2019,22:09,"3,020.97"  
29-Jul-2019,22:08,"3,020.97"  
29-Jul-2019,22:07,"3,020.97"  
29-Jul-2019,22:06,"3,020.97"  
29-Jul-2019,22:05,"3,020.97" <-- we want this, first repeating one  
29-Jul-2019,22:04,"3,020.98" <-- below this, things still change
29-Jul-2019,22:03,"3,020.97"  
29-Jul-2019,22:02,"3,020.94"  
29-Jul-2019,22:01,"3,020.89"  

时间戳之间的跳转可能会有所帮助,但我无法很好地操作数据帧。

同样的数据将与上面的 df 和下面的示例相同。原始数据是为了显示事情是如何变化的。 Local Date_Local Time 已经是 datetime64[ns] andCloseis alreadyfloat64`

    Local Date_Local Time   Close
90  2019-07-31 20:52:00     2971.61
91  2019-07-31 20:51:00     2975.38
92  2019-07-31 20:50:00     2981.48
93  2019-07-31 20:49:00     2985.19

在最终结果中,例如 2019-07-29 22:05 将位于 2019-07-30 15:31 的正下方,因为两者之间的所有内容都重复了。

【问题讨论】:

    标签: python pandas dataframe datetime


    【解决方案1】:

    检查这是否适合你

    df['diff']=df.groupby('Day')['Value'].diff().ne(0)
    a=((df.reset_index().groupby('diff')['index'].apply(np.array))[0])[:4]
    df.drop(a,inplace=True)
    df.drop('diff',axis=1,inplace=True)
    

    [:4] 是基于时间降序排列的表格。如果时间按降序排列,则必须将其更改为 [-3:]。 有了上面的代码,我盯着

    Day     Time    Value
    0   29-Jul-19   22:09   3,020.97
    1   29-Jul-19   22:08   3,020.97
    2   29-Jul-19   22:07   3,020.97
    3   29-Jul-19   22:06   3,020.97
    4   29-Jul-19   22:05   3,020.97
    5   29-Jul-19   22:04   3,020.98
    6   29-Jul-19   22:03   3,020.97
    7   29-Jul-19   22:02   3,020.94
    8   29-Jul-19   22:01   3,020.89
    9   29-Jul-19   22:01   3,020.91
    10  29-Jul-19   22:01   3,020.98
    11  29-Jul-19   22:01   3,020.98
    12  29-Jul-19   22:01   3,020.92
    

    就这样结束了

    Day     Time    Value
    0   29-Jul-19   22:09   3020.97
    5   29-Jul-19   22:04   3020.98
    6   29-Jul-19   22:03   3020.97
    7   29-Jul-19   22:02   3020.94
    8   29-Jul-19   22:01   3020.89
    9   29-Jul-19   22:01   3020.91
    10  29-Jul-19   22:01   3020.98
    11  29-Jul-19   22:01   3020.98
    12  29-Jul-19   22:01   3020.92
    

    【讨论】:

    • 谢谢。我需要分配时间吗?在我的 df 中,日期时间是一列 yyyy-mm-dd hh:mm:00。第二列是收盘价。我会尝试修改一下。
    • 在这种情况下,使用df['diff']=df.groupby(pd.Grouper(key='date', freq='D'))['Value'].diff().ne(0) 而不是df['diff']=df.groupby('Day')['Value'].diff().ne(0)。这里key是日期时间对象的列名。
    • 嗨@mohanys。这运作良好。我更改为.diff(2),以便与 2 分钟前进行比较。我现在还有一两个关于过滤数据的问题。希望你能帮忙。谢谢。
    猜你喜欢
    • 2018-03-21
    • 2023-04-09
    • 2019-07-11
    • 2017-09-08
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2020-06-02
    相关资源
    最近更新 更多