【问题标题】:How to find the value of a column next to a value in a list?如何在列表中的值旁边找到列的值?
【发布时间】:2021-09-09 00:38:15
【问题描述】:

我正在制作动画日历来标记节目播出的日期。我的代码运行良好,但问题是我无法通过搜索所有日期找到动漫的名称。

我认为有两个问题:

  1. 要么我在选项 2 中的搜索代码错误,要么
  2. today_date = 25-6-2021 而不是 25-06-2021

我的动漫数据.....

"Anime","Episodes_Dates"
"Naruto","['30-06-2021', '08-07-2000', '15-07-2000', '22-07-2000', '29-07-2000', '05-08-2000', '12-08-2000', '19-08-2000', '26-08-2000', '02-09-2000', '09-09-2000', '16-09-2000', '23-09-2000', '30-09-2000', '07-10-2000', '14-10-2000', '21-10-2000', '28-10-2000', '04-11-2000', '11-11-2000', '18-11-2000', '25-11-2000', '02-12-2000', '09-12-2000', '16-12-2000', '23-12-2000']"
"Bleach","['26-04-2005', '03-05-2005', '30-06-2021', '17-05-2005', '24-05-2005', '31-05-2005', '07-06-2005', '14-06-2005', '21-06-2005', '28-06-2005', '05-07-2005', '12-07-2005', '19-07-2005', '26-07-2005', '02-08-2005', '09-08-2005', '16-08-2005', '23-08-2005', '30-08-2005', '06-09-2005', '13-09-2005', '20-09-2005', '27-09-2005', '04-10-2005', '11-10-2005', '18-10-2005', '25-10-2005', '01-11-2005', '08-11-2005', '15-11-2005', '22-11-2005', '29-11-2005', '06-12-2005', '20-12-2005']"
"Tokyo Revengers","['30-06-2021', '19-05-2021', '26-05-2021', '02-06-2021', '09-06-2021', '16-06-2021', '25-06-2021', '30-06-2021', '07-07-2021', '14-07-2021', '21-07-2021', '28-07-2021', '04-08-2021', '11-08-2021', '18-08-2021', '25-08-2021', '01-09-2021', '08-09-2021', '15-09-2021', '22-09-2021', '29-09-2021', '06-10-2021', '13-10-2021', '20-10-2021', '27-10-2021', '03-11-2021', '10-11-2021', '17-11-2021', '24-11-2021', '01-12-2021', '08-12-2021', '15-12-2021', '22-12-2021']"
"Tomb Raider","['30-06-2021', '02-07-2021', '09-07-2021', '16-07-2021', '23-07-2021', '30-07-2021', '06-08-2021', '13-08-2021', '20-08-2021', '27-08-2021', '03-09-2021', '10-09-2021', '17-09-2021', '24-09-2021', '01-10-2021', '08-10-2021', '15-10-2021', '22-10-2021', '29-10-2021', '05-11-2021', '12-11-2021', '19-11-2021', '26-11-2021', '03-12-2021', '10-12-2021', '17-12-2021', '24-12-2021']"
"Link Click","['04-11-2021', '11-11-2021', '18-11-2021', '25-11-2021', '02-12-2021', '09-12-2021', '16-12-2021', '23-12-2021', '30-12-2021']"
"Vivy Fluorite's Song","['21-04-2021', '28-04-2021', '05-05-2021', '12-05-2021', '19-05-2021', '26-05-2021', '02-06-2021', '09-06-2021', '16-06-2021', '23-06-2021', '30-06-2021', '07-07-2021', '14-07-2021', '21-07-2021', '28-07-2021', '04-08-2021', '11-08-2021', '18-08-2021', '25-08-2021', '01-09-2021', '08-09-2021', '15-09-2021', '22-09-2021', '29-09-2021', '06-10-2021', '13-10-2021', '20-10-2021', '27-10-2021', '03-11-2021', '10-11-2021', '17-11-2021', '24-11-2021', '01-12-2021', '08-12-2021', '15-12-2021', '22-12-2021', '29-12-2021']"
"Haikyuu","['26-06-2018', '03-07-2018', '10-07-2018', '17-07-2018', '24-07-2018', '31-07-2018', '07-08-2018', '14-08-2018', '21-08-2018', '28-08-2018', '04-09-2018', '11-09-2018', '18-09-2018', '25-09-2018', '02-10-2018', '09-10-2018', '16-10-2018', '23-10-2018', '30-10-2018', '06-11-2018', '13-11-2018', '20-11-2018', '27-11-2018', '04-12-2018', '11-12-2018', '18-12-2018', '25-12-2018']"
"Black Clover","['28-02-2016', '06-03-2016', '13-03-2016', '20-03-2016', '27-03-2016', '03-04-2016', '10-04-2016', '17-04-2016', '24-04-2016', '01-05-2016', '08-05-2016', '15-05-2016', '22-05-2016', '29-05-2016', '05-06-2016', '12-06-2016', '19-06-2016', '26-06-2016', '03-07-2016', '10-07-2016', '17-07-2016', '24-07-2016', '31-07-2016', '07-08-2016', '14-08-2016', '21-08-2016', '28-08-2016', '04-09-2016', '11-09-2016', '18-09-2016', '25-09-2016', '02-10-2016', '09-10-2016', '16-10-2016', '23-10-2016', '30-10-2016', '06-11-2016', '13-11-2016', '20-11-2016', '27-11-2016', '04-12-2016', '11-12-2016', '18-12-2016', '25-12-2016']"

我的代码

import csv
import datetime
from datetime import timedelta, date
import pandas as pd

print(f"(1) Add Anime\n(2) Today Shedule\n(3) Remove an Anime")
choice = input("1,2 or 3:-")

dt = datetime.datetime.now()
d = dt.day
m = dt.month
y = dt.year
today_date = f"{d}-{m}-{y}"
dates =[]

def date_shedule(date1, date2, list):
    def daterange(date1, date2):
        for n in range(0,int((date2 - date1).days)+1,7):
            yield date1 + timedelta(n)

    for dt in daterange(date1, date2):
        list.append(str(dt.strftime("%d-%m-%Y")))
    return list

with open('Anime_Data.csv', 'a') as f:
    w = csv.writer(f, quoting=csv.QUOTE_ALL)

    if choice.strip() == "1":
    #new anime added
        Anime = input("Anime Name:- ")
        Date_Airing_y = int(input("Date of Airing(yyyy):- "))
        Date_Airing_m = int(input("Date of Airing(mm):- "))
        Date_Airing_d = int(input("Date of Airing(dd):- "))

        sum = m +6
        if sum > 12:
            end_m = sum - 12
            end_dt = date(Date_Airing_y+1, end_m, d)
        else:
            end_dt = date(Date_Airing_y, m + 6, d)

        Date = date(Date_Airing_y,Date_Airing_m,Date_Airing_d)

#        w.writerow([Anime, Date_Airing])
        w.writerow([Anime, date_shedule(Date,end_dt,dates)])

    if choice.strip() == '2':
        #todays shedule.......',')
        with open("Anime_Data.csv", "r") as f:
            reader = csv.reader(f)
            for row in reader:
                for dt in row:
                    if dt == today_date:
                        print('yes')
    else:
        print(today_date)

我希望结果如下:
如果我在 Anime_Data.csv 中搜索 today_date,它将给我所有将在 today_date 播出的动漫。

如果有一些不必要的代码,请告诉我,我会努力改进。

【问题讨论】:

  • 听起来你已经知道日期格式的问题了。在今天的日期中,您使用字符串对其进行格式化,但稍后在您的代码中使用 strftime 格式化。我建议与 stftime 保持一致,因此请尝试datetime.datetime.now().strftime("%d-%m-%Y")。由于我还没有运行代码来测试,所以将此作为推荐而不是答案。
  • 还有xkcd.com/1179 ;)
  • @Chet 日期时间问题已解决,但我的选择 == '2' 代码仍然无法正常工作,我仍然面临解决这个问题...

标签: python csv date datetime


【解决方案1】:

按照建议,您可以使用 datetime.strftime() 将 datetime 对象转换为适当格式的日期(请参阅可能的 formatting 选项)

要搜索您的行,您可以在Episode_Dates 列值(即row[1])上简单地使用in,如下所示:

import csv
import datetime
from datetime import timedelta, date
import pandas as pd

print(f"(1) Add Anime\n(2) Today Shedule\n(3) Remove an Anime")
choice = input("1,2 or 3:-")

dt = datetime.datetime.now()
d = dt.day
m = dt.month
y = dt.year
today_date = dt.strftime('%d-%m-%Y')

dates =[]

def date_shedule(date1, date2, list):
    def daterange(date1, date2):
        for n in range(0,int((date2 - date1).days)+1,7):
            yield date1 + timedelta(n)

    for dt in daterange(date1, date2):
        list.append(str(dt.strftime("%d-%m-%Y")))
    return list


if choice.strip() == "1":
#new anime added
    Anime = input("Anime Name:- ")
    Date_Airing_y = int(input("Date of Airing(yyyy):- "))
    Date_Airing_m = int(input("Date of Airing(mm):- "))
    Date_Airing_d = int(input("Date of Airing(dd):- "))

    sum = m + 6
    
    if sum > 12:
        end_m = sum - 12
        end_dt = date(Date_Airing_y+1, end_m, d)
    else:
        end_dt = date(Date_Airing_y, m + 6, d)

    Date = date(Date_Airing_y, Date_Airing_m, Date_Airing_d)
    
    with open('Anime_Data.csv', 'a') as f:
        w = csv.writer(f, quoting=csv.QUOTE_ALL)
        w.writerow([Anime, date_shedule(Date, end_dt, dates)])

if choice.strip() == '2':
    #today's schedule.......',')
    with open("Anime_Data.csv", "r") as f:
        for row in csv.reader(f):
            if len(row) == 2 and today_date in row[1]:
                print(f'{row[0]} - yes')
else:
    print(today_date)

您还应该将用于读取的with open() 向下移动,以确保在选择2 选项时关闭文件。

【讨论】:

  • 感谢您的帮助,我尝试了此代码,但没有成功。现在我正在尝试使用“Data = list(reader)”,这样搜索起来会更容易。
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2021-07-11
  • 2020-02-20
相关资源
最近更新 更多