You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:09:21