【问题标题】:Better way to filter dates in pandas在熊猫中过滤日期的更好方法
【发布时间】:2022-01-21 01:36:46
【问题描述】:

我有一个索引为 UTC 的数据框。我想过滤美国/东部的行。数据如下所示:

                            open   high     low   close   volume  \
timestamp                                                           
2022-01-12 14:00:00-05:00  69.485  69.56  69.445  69.540   800424   
2022-01-12 14:30:00-05:00  69.530  69.60  69.480  69.550   675122   
2022-01-12 15:00:00-05:00  69.555  69.57  69.455  69.505   747475   
2022-01-12 15:30:00-05:00  69.500  69.67  69.410  69.560  2655043   
2022-01-12 16:00:00-05:00  69.540  69.54  69.540  69.540   718856

我只想要每天某个时间之间的行,例如美国东部标准时间上午 9 点到下午 4 点。

这段代码做了我想做的事,但似乎必须有更简单更直接的方法。

    mdf.reset_index(inplace=True)
    mdf["timestamp"] = pd.to_datetime(mdf['timestamp'])
    mdf['timestamp'] = mdf['timestamp'].dt.tz_convert('US/Eastern')
    mdf.index = pd.DatetimeIndex(mdf.timestamp)
    tdf = mdf.between_time('09:00', '16:00')
    bdf = tdf.copy(deep=True)
    bdf.drop(['timestamp'],axis=1, inplace=True)

当我在索引上尝试 between_time 时,我记得它抱怨它不是日期时间,或者我无法转换为东部时间作为索引。然后当我制作新版本时,它说它是一个副本,我做了深拷贝以摆脱那个错误。一定有更好的办法。

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    你可以试试indexer_between_time

    idx = pd.to_datetime(df.index).tz_convert('US/Eastern').indexer_between_time('09:00', '16:00')
    out = df.iloc[idx]
    

    【讨论】:

    • 这个方法更好!
    【解决方案2】:

    你可以避免几行。由于timestamp 已经是您的索引,我们可以直接将其转换为DatetimeIndex。

    mdf.index = pd.to_datetime(mdf.index)
    new = mdf.between_time('09:00', '16:00').reset_index().drop('id', axis=1)
    

    【讨论】:

    • 跳过时区转换可能会给您带来性能优势,但如果 OP 混合了 UTC 偏移量,例如-05:00 和 -04:00 小时。
    • 同意,将编辑我的答案以转换时区。不过BENY的回答更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2017-08-23
    • 2021-05-30
    • 2020-05-05
    • 2013-06-09
    相关资源
    最近更新 更多