【问题标题】:deleting tuple elements based on condition根据条件删除元组元素
【发布时间】:2020-12-13 18:55:44
【问题描述】:

具有 DST 值的数据框:

data0 = pd.DataFrame({'DST':[33,11,-52,7,80,34,41,68,-87],'Date':['1975-01-03','1975-01-04','1975-01-07','1975-01-08','1975-01-13','1975-01-14','1975-01-15','1975-02-01','1975-02-03']})
data0
    DST       Date
0   33  1975-01-03
1   11  1975-01-04
2  -52  1975-01-07
3    7  1975-01-08
4   80  1975-01-13
5   34  1975-01-14
6   41  1975-01-15
7   68  1975-02-01
8  -87  1975-02-03

我拥有的元组:

combined_date = [('1975-01-03', '1975-01-06'),('1975-01-13', '1975-01-15'),
                 ('1975-01-31', '1975-02-02'),('1975-02-03', '1975-02-13')]

问题: 如果 DST 在元组中的这些日期之间低于 -50,我必须删除元组元素。 我试过代码:

for i in len(data0):
    if data0['DST'][i]<-50:
        del (j for j in combined_date if data0['DATE'][i]>=j[0] and data0['DATE'][i]<=j[1])

预期输出:

('1975-01-03', '1975-01-06'),('1975-01-13', '1975-01-15'),
('1975-01-31', '1975-02-02')

发生错误:无法删除生成器表达式。

注意

如果 DST 发现低于 -50,则必须删除该元组!

【问题讨论】:

  • @jezrael 感谢您指出错误。这是编辑过的。
  • 因为在该区间 DST 低于 -50。在 1975-02-03,DST 是
  • 其实我的数据在每一分钟。所以我不能上传样本数据。例如 1 个月我有 31*24*60 行。对样本 df 有任何想法吗?
  • 对不起,我再次检查了你的代码,现在它完美了,我想你也改变combined_date :(

标签: python pandas numpy date math


【解决方案1】:

boolean indexing 中的第一个过滤行:

data0['Date'] = pd.to_datetime(data0['Date'])
df = data0[data0['DST']<-50]
print (df)
   DST       Date
3  -67 1975-01-07
4  -80 1975-01-15

然后使用Series.betweenSeries.any 删除列表理解中的元组值:

out = [j  for j in combined_date if not df['Date'].between(j[0], j[1]).any()]
print (out)

【讨论】:

    【解决方案2】:

    从解析器的角度看你的代码:

    del (j for j in combined_date if ...)
    

    括号中包含了一个生成器。删除生成器表达式是什么意思?

    想要做的是删除列表中的元素。在大多数应用程序中,最有效的方法是翻转你的逻辑并保留你想要的元素。而不是删除...

    kept_date = [j for j in combined_date if ...]
    

    你能从那里拿走吗?

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 2011-11-29
      • 2022-12-18
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2023-03-07
      相关资源
      最近更新 更多