如何修改Python股票代码中的日期输出为YYYY-MM-DD格式?
解决方案
问题核心在于FindTrend模块输出的日期是文件中存储的MM/DD/YYYY格式,我们需要将其转换为YYYY-MM-DD格式后再输出。可以通过以下两步实现:
1. 添加日期格式转换函数
在代码开头(namedtuple定义之后)添加一个用于转换日期格式的函数,将MM/DD/YYYY转为YYYY-MM-DD,同时处理月份和日期的补零(比如7/6/2019转为2019-07-06):
from collections import namedtuple stoc = namedtuple('stoc','date close') # 添加日期转换函数 def convert_to_iso_date(mmddyyyy_date): month, day, year = mmddyyyy_date.split('/') # 为月份和日期补零,确保是两位数字 return f"{year}-{month.zfill(2)}-{day.zfill(2)}"
2. 修改FindTrend模块的输出逻辑
原代码中通过stock_listt.index(j)获取索引的方式存在隐患(如果有相同价格会获取到第一个匹配项的索引),建议改用enumerate遍历索引和价格;同时在输出时调用转换函数将日期格式转为YYYY-MM-DD。
修改后的FindTrend模块代码如下:
elif s[0] == 'FindTrend': stocx = [item[0] for item in stocklist] stocx1 = [item[1] for item in stocklist] stocxx = [item[0] for item in stocklist1] stocxx1 = [item[1] for item in stocklist1] dat1 = s[2].split('-') year3 = dat1[0] month3 = dat1[1].lstrip('0') day3 = dat1[2].lstrip('0') datt2 = month3+'/'+day3+'/'+year3 dat2 = s[3].split('-') year4 = dat2[0] month4 = dat2[1].lstrip('0') day4 = dat2[2].lstrip('0') datt3 = month4+'/'+day4+'/'+year4 if s[1] == 'PFE': if datt2 not in stocx or datt3 not in stocx: pass else: start_idx = stocx.index(datt2) end_idx = stocx.index(datt3) + 1 date_list = stocx[start_idx:end_idx] price_list = stocx1[start_idx:end_idx] f = [0] * len(price_list) # 改用enumerate遍历索引和价格,避免重复价格导致的索引错误 for idx, price in enumerate(price_list): formatted_date = convert_to_iso_date(date_list[idx]) if idx < 3: print(f"{formatted_date} | {price}") elif (float(price) < float(price_list[idx-1]) and float(price_list[idx-1]) > float(price_list[idx-2]) and float(price_list[idx-2]) > float(price_list[idx-3]) and 1 not in f[idx-4:idx-1]): f[idx] = 1 print(f"{formatted_date} | {price} | sell") elif (float(price) > float(price_list[idx-1]) and float(price_list[idx-1]) < float(price_list[idx-2]) and float(price_list[idx-2]) < float(price_list[idx-3]) and 1 not in f[idx-4:idx-1]): f[idx] = 1 print(f"{formatted_date} | {price} | buy") else: print(f"{formatted_date} | {price}") if s[1] == 'MRNA': if datt2 not in stocxx or datt3 not in stocxx: pass else: start_idx = stocxx.index(datt2) end_idx = stocxx.index(datt3) + 1 date_list = stocxx[start_idx:end_idx] price_list = stocxx1[start_idx:end_idx] f1 = [0] * len(price_list) # 改用enumerate遍历索引和价格,避免重复价格导致的索引错误 for idx, price in enumerate(price_list): formatted_date = convert_to_iso_date(date_list[idx]) if idx < 3: print(f"{formatted_date} | {price}") elif (float(price) < float(price_list[idx-1]) and float(price_list[idx-1]) > float(price_list[idx-2]) and float(price_list[idx-2]) > float(price_list[idx-3]) and 1 not in f1[idx-4:idx-1]): f1[idx] = 1 print(f"{formatted_date} | {price} | sell") elif (float(price) > float(price_list[idx-1]) and float(price_list[idx-1]) < float(price_list[idx-2]) and float(price_list[idx-2]) < float(price_list[idx-3]) and 1 not in f1[idx-4:idx-1]): f1[idx] = 1 print(f"{formatted_date} | {price} | buy") else: print(f"{formatted_date} | {price}")
完整修改后的代码
from collections import namedtuple stoc = namedtuple('stoc','date close') # 添加日期转换函数 def convert_to_iso_date(mmddyyyy_date): month, day, year = mmddyyyy_date.split('/') # 为月份和日期补零,确保是两位数字 return f"{year}-{month.zfill(2)}-{day.zfill(2)}" def StockMarket(): 'This function reads two stock files, PFE and MRNA, it then is able to find the price on a specific date and the maxpossible profit and loss, as well as the morning and evening star trends.' stocks = {} stocks1 = {} stocklist = [] stocklist1 = [] dates = [] while True: s = input('$ ').split() if s[0] == 'quit': return elif s[0] == 'ReadFiles': for entry in open(s[1],'r'): elist = entry.split(',') stocks[elist[0]] = elist[4] readfiles = stoc(elist[0], elist[4]) stocklist.append(readfiles) for entry1 in open(s[2],'r'): elist1 = entry1.split(',') stocks1[elist1[0]] = elist1[4] readfiles1 = stoc(elist1[0], elist1[4]) stocklist1.append(readfiles1) elif s[0] == 'PricesOnDate': dates = s[1].split('-') year = dates[0] month = dates[1].lstrip('0') day = dates[2].lstrip('0') date1 = month+'/'+day+'/'+year print('PFE:', stocks[date1], '|', 'MRNA:', stocks1[date1]) elif s[0] == 'MaxPossible': sto = [item[0] for item in stocklist] sto1 = [item[1] for item in stocklist] st = [item[0] for item in stocklist1] st1 = [item[1] for item in stocklist1] dates1 = s[3].split('-') year1 = dates1[0] month1 = dates1[1].lstrip('0') day1 = dates1[2].lstrip('0') date2 = month1+'/'+day1+'/'+year1 dates2 = s[4].split('-') year2 = dates2[0] month2 = dates2[1].lstrip('0') day2 = dates2[2].lstrip('0') date3 = month2+'/'+day2+'/'+year2 if s[1] == 'profit': if s[2] == 'PFE': stocksub_list = sto1[sto.index(date2):sto.index(date3)+1] for i in range(0, len(stocksub_list)): stocksub_list[i] = float(stocksub_list[i]) a = max(stocksub_list) price = stocksub_list[0] b = min(stocksub_list[stocksub_list.index(price):stocksub_list.index(max(stocksub_list))+1]) print(a-b) if s[2] == 'MRNA': stocksub_list1 = st1[st.index(date2):st.index(date3)+1] for i in range(0, len(stocksub_list1)): stocksub_list1[i] = float(stocksub_list1[i]) a1 = max(stocksub_list1) price1 = stocksub_list1[0] b1 = min(stocksub_list1[stocksub_list1.index(price1):stocksub_list1.index(max(stocksub_list1))+1]) print(a1-b1) if s[1] == 'loss': if s[2] == 'PFE': stocksub_list = sto1[sto.index(date2):sto.index(date3)+1] for i in range(0, len(stocksub_list)): stocksub_list[i] = float(stocksub_list[i]) a2 = max(stocksub_list) price2 = None b2 = min(stocksub_list[stocksub_list.index(max(stocksub_list)):]) print(a2-b2) if s[2] == 'MRNA': stocksub_list1 = st1[st.index(date2):st.index(date3)+1] for i in range(0, len(stocksub_list1)): stocksub_list1[i] = float(stocksub_list1[i]) a3 = max(stocksub_list1) price3 = None b3 = min(stocksub_list1[stocksub_list1.index(max(stocksub_list1)):]) print(a3-b3) elif s[0] == 'FindTrend': stocx = [item[0] for item in stocklist] stocx1 = [item[1] for item in stocklist] stocxx = [item[0] for item in stocklist1] stocxx1 = [item[1] for item in stocklist1] dat1 = s[2].split('-') year3 = dat1[0] month3 = dat1[1].lstrip('0') day3 = dat1[2].lstrip('0') datt2 = month3+'/'+day3+'/'+year3 dat2 = s[3].split('-') year4 = dat2[0] month4 = dat2[1].lstrip('0') day4 = dat2[2].lstrip('0') datt3 = month4+'/'+day4+'/'+year4 if s[1] == 'PFE': if datt2 not in stocx or datt3 not in stocx: pass else: start_idx = stocx.index(datt2) end_idx = stocx.index(datt3) + 1 date_list = stocx[start_idx:end_idx] price_list = stocx1[start_idx:end_idx] f = [0] * len(price_list) for idx, price in enumerate(price_list): formatted_date = convert_to_iso_date(date_list[idx]) if idx < 3: print(f"{formatted_date} | {price}") elif (float(price) < float(price_list[idx-1]) and float(price_list[idx-1]) > float(price_list[idx-2]) and float(price_list[idx-2]) > float(price_list[idx-3]) and 1 not in f[idx-4:idx-1]): f[idx] = 1 print(f"{formatted_date} | {price} | sell") elif (float(price) > float(price_list[idx-1]) and float(price_list[idx-1]) < float(price_list[idx-2]) and float(price_list[idx-2]) < float(price_list[idx-3]) and 1 not in f[idx-4:idx-1]): f[idx] = 1 print(f"{formatted_date} | {price} | buy") else: print(f"{formatted_date} | {price}") if s[1] == 'MRNA': if datt2 not in stocxx or datt3 not in stocxx: pass else: start_idx = stocxx.index(datt2) end_idx = stocxx.index(datt3) + 1 date_list = stocxx[start_idx:end_idx] price_list = stocxx1[start_idx:end_idx] f1 = [0] * len(price_list) for idx, price in enumerate(price_list): formatted_date = convert_to_iso_date(date_list[idx]) if idx < 3: print(f"{formatted_date} | {price}") elif (float(price) < float(price_list[idx-1]) and float(price_list[idx-1]) > float(price_list[idx-2]) and float(price_list[idx-2]) > float(price_list[idx-3]) and 1 not in f1[idx-4:idx-1]): f1[idx] = 1 print(f"{formatted_date} | {price} | sell") elif (float(price) > float(price_list[idx-1]) and float(price_list[idx-1]) < float(price_list[idx-2]) and float(price_list[idx-2]) < float(price_list[idx-3]) and 1 not in f1[idx-4:idx-1]): f1[idx] = 1 print(f"{formatted_date} | {price} | buy") else: print(f"{formatted_date} | {price}") StockMarket()
说明
- 新增的
convert_to_iso_date函数负责将文件中存储的MM/DD/YYYY日期转换为标准的YYYY-MM-DD格式,同时通过zfill(2)确保月份和日期始终是两位数字(比如7转为07)。 - 改用
enumerate遍历价格列表,避免了原代码中因重复价格导致索引错误的问题。 - 所有输出日期的位置都替换为转换后的格式,满足需求。
内容的提问来源于stack exchange,提问作者zetocan
相关产品推荐
相关产品推荐

