【问题标题】:How do you isolate the rows in a DataFrame that are between two times for an if statement?如何隔离 DataFrame 中 if 语句两次之间的行?
【发布时间】:2019-05-17 02:23:04
【问题描述】:

我有一个数据框,其中包含一年中每个小时的数据,我想在 9:00 到 17:00 之间的所有行中创建一个零的新行,并在同一行中添加如果不在此时间范围内,则来自另一行的数据

我相信我想要类似的东西;

if '9.00' >= final_df.index <= '17.00':
    do some action
else
    do another action

这还不起作用,第一个原因是目前它缺少完整日期。有什么办法可以解决这个问题吗?如果我使用,第一行的作品;

if '2017-10-16 9.00' >= final_df.index <= '2017-10-16 17.00':

有没有办法解决这个问题。

作为参考,前 5 个数据点是;

                       A    B       C   D   E
Timestamp                   
2017-10-15 13:30:00 59.9    17.14   0   1   0
2017-10-15 14:30:00 64.3    17.22   0   1   0
2017-10-15 15:30:00 68.6    17.18   0   1   0
2017-10-15 16:30:00 77.6    17.08   0   1   0
2017-10-15 17:30:00 74.5    16.93   0   1   0

【问题讨论】:

  • 您要执行的“操作”是什么?解决方案可能(也可能不)取决于它。
  • @coldspeed 这样更好吗?
  • 差不多...预期的结果是什么?
  • @Georgy 我不这么认为,因为我认为我不能为此使用 .between_time,但我可能错了

标签: python pandas datetime


【解决方案1】:

您可以使用DatetimeIndex.hour 创建一个可以在DataFrame 上使用的掩码。对于您给定的数据,假设感兴趣的区域是 15 到 17 之间的区域,并且您想对该区域中的 A 和外部的 B 求和。您可以通过以下方式做到这一点:

In [100]: mask = (df.index.hour > 14) & (df.index.hour < 17)

In [101]: df[mask].A.sum()
Out[101]: 146.2

In [102]: df[~mask].B.sum()
Out[102]: 51.29

编辑:现在添加到问题中的任务恰好也可以通过这种方法轻松解决;假设感兴趣的列是B

In [117]: df['Result'] = ~mask * df.B

In [118]: df
Out[118]:
                        A      B  C  D  E  Result
Timestamp
2017-10-15 13:30:00  59.9  17.14  0  1  0   17.14
2017-10-15 14:30:00  64.3  17.22  0  1  0   17.22
2017-10-15 15:30:00  68.6  17.18  0  1  0    0.00
2017-10-15 16:30:00  77.6  17.08  0  1  0    0.00
2017-10-15 17:30:00  74.5  16.93  0  1  0   16.93

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多