我正在处理时间序列数据,数据帧的示例如下。
输入数据:
| 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/