具有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,则必须删除该元组!
答案 0 :(得分: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.between
和Series.any
删除列表理解中的元组值:
out = [j for j in combined_date if not df['Date'].between(j[0], j[1]).any()]
print (out)
答案 1 :(得分:1)
从解析器的角度查看代码:
del (j for j in combined_date if ...)
括号括起一个生成器。删除生成器表达式是什么意思?
您想要要做的是删除列表中的元素。在大多数应用程序中,最有效的方法是翻转逻辑并保持所需的元素。而不是删除...
kept_date = [j for j in combined_date if ...]
你能从那里拿走吗?