我有以下
df1 = pd.DataFrame({ 'Column1':['s','g','h','word2','d','f','word1','d']})
a = df1.Column1.isin(['word1','word2']).idxmax()
print (a)
3
我想删除中间日期,因为它太接近前一个日期(不到一小时)。一旦删除,第三个应该留在那里,因为它不太接近前一个(现在是第一个)
我知道如何转换日期,我知道如何制作一个基本的for循环来查找要删除的日期,我知道如何删除它。
我的问题是:是否有任何一个班轮可以解决这个问题?我正在查看lodash,但无法找到任何
澄清:
数组始终排序。该函数应该验证当前元素与前一个元素的对比。如果删除当前元素,则应将下一个元素与移除的元素进行比较
答案 0 :(得分:4)
单线,可能不是,但你可以这样做:
var last = -Infinity, threshold = 60 * 60 * 1000;
var result = dates.filter(function(date) {
var time = Date.parse(date);
if( time - last < threshold) return false;
last = time;
return true;
});
这会跟踪上一个时间戳,允许filter
调用引用它。
答案 1 :(得分:4)
不是单行,但它不长:
let lastDate = null;
dates = dates.filter(date => {
date = parseDate(date);
if (!lastDate || date - lastDate >= ONE_HOUR) {
lastDate = date;
return true;
}
});
let dates = [
"2017-09-11 13:30:45",
"2017-09-11 14:20:00",
"2017-09-11 15:00:00"
];
const ONE_HOUR = 1000 * 60 * 60;
let lastDate = null;
dates = dates.filter(date => {
date = parseDate(date);
if (!lastDate || date - lastDate >= ONE_HOUR) {
lastDate = date;
return true;
}
});
console.log(dates);
function parseDate(s) {
return Date.parse(s.replace(' ', 'T'));
}
&#13;
答案 2 :(得分:0)
如果您希望以后获得更多控制权,可以使用更受欢迎的date time
解析库,例如moment.js
。它会使您的代码更加 可读 和 可维护 。
var dates = [
"2017-09-11 13:30:45",
"2017-09-11 14:20:00",
"2017-09-11 15:00:00"
];
var TIME_DIFF = 45; //minutes
for (var i = 0; i < dates.length - 1; i++) {
if (Math.abs(moment(dates[i + 1]).diff(moment(dates[i]), 'minutes')) > TIME_DIFF) {
dates.splice(i + 1, 1);
}
}
console.log(dates);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>
更多细节可以在这里找到 https://momentjs.com/