这种题目该怎么设计呢?
本帖最后由 艾依古 于 2020-6-27 19:56 编辑读取文件“nino12_dropnan_result.csv”,根据列 Lable 判断,假设若连
续出现 5 次'LaNinaTemp'则判定为出现了一次 LaNina 事件,选择 LaNina 事
件出现的开始时间存储到列表 LaNinaList 中;假设若连续出现 5 次
NinoTemp 则认为出现了 Nino 事件,选择 Nino 事件出现的开始时间存储到
列表 NinoList 中。最后,将列表 LaNinaList、NinoList 分别保存到文本文件
“LaNinaStartDate.txt”、“NinoStartDate.txt”中。
csv数据如下(部分):
Data Nino12 Label
1870-01-01 -1.5 LaNina Temp
1870-02-01 -0.96 LaNina Temp
1870-03-01 -0.65 LaNina Temp
1870-04-01 -0.32 Cold
1870-05-01 -0.64 LaNina Temp
1870-06-01 -0.96 LaNina Temp
1870-07-01 -0.98 LaNina Temp
1870-08-01 -1.02 LaNina Temp
1870-09-01 -1.02 LaNina Temp
1870-10-01 -1.53 LaNina Temp
1870-11-01 -1.42 LaNina Temp
1870-12-01 -1.25 LaNina Temp
1871-01-01 -0.74 LaNina Temp
1871-02-01 -0.56 LaNina Temp
1871-03-01 -0.78 LaNina Temp
1871-04-01 -0.59 LaNina Temp
1871-05-01 -0.76 LaNina Temp
1871-06-01 -0.25 Cold
1871-07-01 -0.34 Cold
1871-08-01 -0.3 Cold
…… #导入两个模块
import pandas as pd
import itertools as it
#读取文件
data = pd.read_csv("table.csv")
label = list(data["Label"])#选择label列
date = list(data["Data"])#选择日期列
#将日期列和label列5个,5个分为一组形成一个二维列表
label_5 = for i in range(0,len(label)-4)]
date_5 = for i in range(0,len(date)-4)]
LaNina = []
Nino = []
#检测这列表中的每五个label是不是都是Lanina或者Nino,是就获取对应日期
for each_label,each_date in zip(label_5,date_5):
if each_label.count("LaNina Temp") == 5:
LaNina.append(each_date)
elif each_label.count("Nino Temp") == 5:
Nino.append(each_date)
else:#去重复,保存为新文件
date_LaNina = sorted(set())
date_Nino = sorted(set())
with open("LaNinaStartDate.txt","w") as f1:
for i in date_LaNina:
f1.writelines("%s\n" %i)
with open("NinoStartDate.txt","w") as f2:
for j in date_Nino:
f2.writelines("%s\n" %j)
上面的结果,可以跑出来,我试过了。
不懂得话,就把你的csv文件名字改为table.csv
再把这个代码保存为一个新的py文件
把代码的py文件和csv文件放在同一个目录下
双击运行py文件,即可以出结果 BIO-张磊 发表于 2020-6-27 20:36
上面的结果,可以跑出来,我试过了。
不懂得话,就把你的csv文件名字改为table.csv
再把这个代码保存为一 ...
太谢谢啦!可以运行出来。
还想问一下,可以根据下面这个参考案例做这题吗?
参考案例:计算一个列表中连续相同的元素个数,并返回连续出现 4 次及以上
的 1 所在的开始位置。
import itertools
mylist =
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]
print(num_times)
sumIndexList = []#存储符合要求的元素首次出现的位置
for i in range(len(num_times)):
if num_times == 1 and num_times >= 4:
sumIndex = 0
while i >= 1:
sumIndex += num_times
i = i - 1
sumIndexList.append(sumIndex)
print("符合要求的元素首次出现的位置列表为:",sumIndexList)结果:
输出结果:
[(1, 2), (0, 1), (1, 3), (0, 4), (1, 4), (0, 1), (1, 1), (0, 1), (11, 1), (0, 1)]
符合要求的元素首次出现的位置列表为: 本帖最后由 Twilight6 于 2020-6-27 21:10 编辑
艾依古 发表于 2020-6-27 20:48
太谢谢啦!可以运行出来。
还想问一下,可以根据下面这个参考案例做这题吗?
参考案例:计算一个列表中 ...
这样可行不?
import pandas as pd
import itertools
dp = pd.read_csv('nino12_dropnan_result.csv')
mylist = list(dp['Label'])
date = list(dp['Data'])
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]
LaNinaList = []
NinoList = []
for i in range(len(num_times)):
if num_times == 'LaNina Temp' and num_times >= 5:
sumIndex = 0
while i >= 1:
sumIndex += num_times
i = i - 1
if sumIndex not in LaNinaList:
LaNinaList.append(date)
elif num_times == 'Nino Temp' and num_times >= 5:
sumIndex = 0
while i >= 1:
sumIndex += num_times
i = i - 1
if sumIndex not in NinoList:
NinoList.append(date)
with open('LaNinaStartDate.txt','w') as f:
for i in LaNinaList:
f.write(i+'\n')
with open('NinoStartDate.txt','w') as f:
for i in NinoList:
f.write(i+'\n')
Twilight6 发表于 2020-6-27 21:02
这样可行不?
他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。 Twilight6 发表于 2020-6-27 21:02
这样可行不?
可以运行出来,但是结果好像有点问题,统计的事件开始时间会重复很多遍,有的时间不符合要求 BIO-张磊 发表于 2020-6-27 21:18
他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。
题目不是只要开始时间嘛{:10_297:}
BIO-张磊 发表于 2020-6-27 21:18
他这个代码的思想是好的,但是只能得到开始日期,持续日期没法直接得出,还要慢慢去加。我卡在这了。
好滴,谢谢你啦~ Twilight6 发表于 2020-6-27 21:20
题目不是只要开始时间嘛
{:10_284:}好吧 本帖最后由 Twilight6 于 2020-6-27 22:00 编辑
艾依古 发表于 2020-6-27 21:20
可以运行出来,但是结果好像有点问题,统计的事件开始时间会重复很多遍,有的时间不符合要求
好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:
import pandas as pd
import itertools
dp = pd.read_csv('nino12_dropnan_result.csv')
mylist = list(dp['Label'])
date = list(dp['Data'])
num_times = [(k, len(list(v))) for k, v in itertools.groupby(mylist)]
LaNinaList = []
NinoList = []
for i in range(len(num_times)):
if num_times == 'LaNina Temp' and num_times >= 5:
sumIndex = 0
while i >= 1:
sumIndex += num_times
i = i - 1
if date not in LaNinaList:
LaNinaList.append(date)
elif num_times == 'Nino Temp' and num_times >= 5:
sumIndex = 0
while i >= 1:
sumIndex += num_times
i = i - 1
if date not in NinoList:
NinoList.append(date)
with open('LaNinaStartDate.txt','w') as f:
for i in set(LaNinaList):
f.write(i+'\n')
with open('NinoStartDate.txt','w') as f:
for i in set(NinoList):
f.write(i+'\n')
BIO-张磊 发表于 2020-6-27 21:24
好吧
{:10_297:} 你改改 我代码楼主说会出现时间不对,我不懂怎么改了 艾依古 发表于 2020-6-27 21:23
好滴,谢谢你啦~
#导入两个模块
import pandas as pd
import itertools as it
#读取文件
data = pd.read_csv("table.csv")
label = list(data["Label"])#选择label列
date = list(data["Data"])#选择日期列
label_5 = [(key,len(list(group))) for key,group in it.groupby(label)]
LaNina = []
Nino = []
for i,j in zip(label_5,range(len(label_5))):
if i == "LaNina Temp" and i >= 5:
LaNina_index = 0
while j >= 1:
LaNina_index += label_5
j -= 1
LaNina.append(date)
elif i == "Nino Temp" and i >= 5:
Nino_index = 0
while j >= 1:
Nino_index += label_5
j -= 1
Nino.append(date)
with open('LaNinaStartDate.txt','w') as f1:
for i in LaNina:
f1.writelines(i+'\n')
with open('NinoStartDate.txt','w') as f2:
for j in Nino:
f2.writelines(j+'\n')
你这个代码我不熟悉,我只能改成这样了 BIO-张磊 发表于 2020-6-27 21:39
你这个代码我不熟悉,我只能改成这样了
好滴,谢谢啦!我再去试一试 Twilight6 发表于 2020-6-27 21:25
好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:
哈哈,好滴,谢谢你啦!我再去试一下。 Twilight6 发表于 2020-6-27 21:25
你改改 我代码楼主说会出现时间不对,我不懂怎么改了
if sumIndex not in LaNinaList:
LaNinaList.append(date)
你应该错在这一句了,sumindex是索引,但是你LaNinalist全部是日期
索引当然不会在日期列表里啦 艾依古 发表于 2020-6-27 21:48
好滴,谢谢啦!我再去试一试
如果可以,跟我们确认一下 BIO-张磊 发表于 2020-6-27 21:55
你应该错在这一句了,sumindex是索引,但是你LaNinalist全部是日期
索引当然不会在日期列表里啦
对!!!我疏忽大意了 谢谢,已改正 BIO-张磊 发表于 2020-6-27 21:39
你这个代码我不熟悉,我只能改成这样了
可以可以!你们两个的都可以~ Twilight6 发表于 2020-6-27 21:25
好吧...数据没得核对,不懂怎么改进了哈哈 你试试这个,应该可以把重复的去掉:
你们好厉害!两个人的都可以!如果想要最后写入txt文件的时间按升序排列是不是得在后面加些什么?
页:
[1]
2