python - 如何根据pandas中的特定列和时间值替换零?

标签 python pandas dataframe

我正在处理时间序列数据,数据帧的示例如下。

输入数据:

|      date        || Device_Id |   | value |
| ---------------- || --------- |   | ----- |
| 28-12-2018 00:00 ||     d1    |   | 0.014 |
| 28-12-2018 00:15 ||     d1    |   | 0.012 |
| 28-12-2018 00:30 ||     d1    |   | 0.012 |
| 28-12-2018 00:45 ||     d1    |   | 0.014 |
| 28-12-2018 01:00 ||     d1    |   | 0.012 |
| 28-12-2018 01:15 ||     d1    |   | 0.012 |
| 28-12-2018 01:30 ||     d1    |   | 0.012 |
| 28-12-2018 01:45 ||     d1    |   | 0.012 |
| 28-12-2018 02:00 ||     d1    |   | 0.014 |
| 28-12-2018 02:15 ||     d1    |   | 0.012 |
|      ....        ||     d1    |   |  ...  |
|        .         ||     .     |   |   .   |
|        .         ||     .     |   |   .   |
| 31-03-2019 23:45 ||     d2    |   |   .   |

预期输出:

|      date        || Device_Id |   | value |
| ---------------- || --------- |   | ----- |
| 28-12-2018 00:00 ||     d1    |   | 0.014 |
| 28-12-2018 00:15 ||     d1    |   | 0.012 |
| 28-12-2018 00:30 ||     d1    |   | 0.012 |
| 28-12-2018 00:45 ||     d1    |   | 0.014 |
| 28-12-2018 01:00 ||     d1    |   |   0   |
| 28-12-2018 01:15 ||     d1    |   |   0   |
| 28-12-2018 01:30 ||     d1    |   |   0   |
| 28-12-2018 01:45 ||     d1    |   |   0   |
| 28-12-2018 02:00 ||     d1    |   |   0   |
| 28-12-2018 02:15 ||     d1    |   |   0   |
|      ....        ||     d1    |   |  ...  |
|        .         ||     .     |   |   .   |
|        .         ||     .     |   |   .   |
| 31-03-2019 23:45 ||     d2    |   |   .   |

我想根据 Device_Id、日期和凌晨 1 点到 6 点之间的时间替换原始数据框中的零值。我尝试用不同的方式解决问题,但无法得到想要的结果。下面是我尝试过的代码。

data1['value']=data1.loc[(data1['Device_Id'].str.contains('d1') & data1['date'].str.contains('28-12-2018')), 'value'].between_time('01:00:00', '06:00:00') = 0

上面的代码显示错误“无法分配给函数调用”。之后,我尝试了下面的方法。

data1['value']=data1.loc[(data1['Device_Id'].str.contains('d1') & data1['date'].str.contains('28-12-2018')), 'value'].between_time('01:00:00', '06:00:00') * 0

这可以工作,但不会更新原始数据框。

最佳答案

使用DatetimeIndex.indexer_between_time创建DatetimeIndex对于时间之间的索引:

#if necessary
#data1['date'] = pd.to_datetime(data1['date'])
data1 = data1.set_index('date')

mask = data1['Device_Id'].str.contains('d1') & (data1.index.normalize() == '28-12-2018')
idx = data1[mask].index.indexer_between_time('01:00:00', '06:00:00')

data1.loc[data1[mask].index[idx], 'value'] = 0

print (data1)
                    Device_Id  value
date                                
2018-12-28 00:00:00        d1  0.014
2018-12-28 00:15:00        d1  0.012
2018-12-28 00:30:00        d1  0.012
2018-12-28 00:45:00        d1  0.014
2018-12-28 01:00:00        d1  0.000
2018-12-28 01:15:00        d1  0.000
2018-12-28 01:30:00        d1  0.000
2018-12-28 01:45:00        d1  0.000
2018-12-28 02:00:00        d1  0.000
2018-12-28 02:15:00        d1  0.000

更简单的是使用 Series.between指定日期时间,因此可以通过掩码设置值:

#if necessary
#data1['date'] = pd.to_datetime(data1['date'])

mask = (data1['Device_Id'].str.contains('d1') & 
        data1['date'].between('28-12-2018 01:00:00', '28-12-2018 06:00:00'))

data1.loc[mask, 'value'] = 0

关于python - 如何根据pandas中的特定列和时间值替换零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67277375/

相关文章:

python - Pandas 滚动窗口和日期时间索引 : What does `offset` mean?

python - Pandas:使用波浪号运算符通过两个过滤器返回反向数据

python - 在 pandas 数据框上使用 apply 时传递值的形状错误

python - 服务器无法恢复事务。描述 :9800000002. (3971) (SQLEndTran)')

python - Pandas 中的 fillna - 如何自动选择最佳方法?

scala - 一对行上的 Spark Dataframe 滑动窗口

indexing - Pandas 数据框 : how to match on multiple index levels when doing arithmetic operations involving two dataframes

python - Kivy 性能随时间下降

python - 在 Python 列表中高效搜索部分字符串

python - 在 Python 中使用 DPAPI?