【问题标题】:Subtract two date time in CSV Column在 CSV 列中减去两个日期时间
【发布时间】:2021-11-08 20:55:40
【问题描述】:
{
"First Name": "Jonathan",
"Last Name": "Thomas",
"Marital Status": "married or civil partner",
"Sex": "Male",
"Age (Years)": 46,
"Retired": true,
"Distance Commuted to Work (miles)": 13.72,
"Employer Company": "Begum-Williams",
"Dependants": 1,
"Yearly Salary (\u00c2\u00a3)": 54016,
"Yearly Pension (\u00c2\u00a3)": 0,
"Address Street": {
  "Address Street": "00 Wheeler wells",
  "Address City": "Chapmanton",
  "Address Postcode": "L2 7BT"
},
"Credit Card Number": {
  "Credit Card Number": "1234567891011121",
  "Credit Card Start Date": "08/12",
  "Credit Card Expiry Date": "11/26",
  "Credit Card CVV": 000,
  "Bank IBAN": "GB37UMCO54540228728019"
},
"Vehicle Make": {
  "Vehicle Make": "Nissan",
  "Vehicle Model": "ATS",
  "Vehicle Year": 1996,
  "Vehicle Type": "Coupe"
}

我有随机写入标题订单的客户数据。项目的 JSON 要求高于顺序。所以我在下面写了一个代码来放置正确的顺序并转换为类型。

l = []

with open("userdata.csv", 'r') as data_file:

    reader = csv.reader(data_file)
    headers = next(reader)
    for reader_row in reader:
        d = {}
        
        d[headers[11]] = str(reader_row[11])
        d[headers[13]] = str(reader_row[13])
        d[headers[14]] = str(reader_row[14])
        d[headers[18]] = str(reader_row[18])
        d[headers[3]] = int(reader_row[3])
        d[headers[16]] = bool(reader_row[16]
        d[headers[4]] = float(reader_row[4])
        d[headers[5]] = str(reader_row[5])
        d[headers[10]] = int(reader_row[10]) if reader_row[10] else None 
        d[headers[17]] = int(reader_row[17])
        d[headers[15]] = int(reader_row[15])
        d[headers[0]]={'Address Street': str(reader_row[0]),
                       'Address City': str(reader_row[1]),
                       'Address Postcode': str(reader_row[2])
                       }
        d[headers[8]]={'Credit Card Number': str(reader_row[8]),
                       'Credit Card Start Date': str(reader_row[6]),
                       'Credit Card Expiry Date': str(reader_row[7]),
                       'Credit Card CVV': int(reader_row[9]),
                       'Bank IBAN' : str(reader_row[12])
                       }
        d[headers[19]]={'Vehicle Make': str(reader_row[19]),
                        'Vehicle Model': str(reader_row[20]),
                        'Vehicle Year': int(reader_row[21]),
                        'Vehicle Type': str(reader_row[22])
                        }
        l.append(d)
    print(d)   

然后,我想为开始和结束日期相隔 10 年以上的任何客户保存一个 JSON 文件。

with open("remove_ccard.json", 'w', encoding='utf-8') as remove: 
    json.dump([d for d in l if d['Credit Card Expiry Date'[-2:]] - d['Credit Card Start Date'[-2:]] > 10], remove)

但是我在该行出现错误,您能帮我修复上一个代码,还是指导我在哪部分写错了?

start_date = []
end_date = []

start_date_single = datetime.strptime(reader_row[6],"%m/%y")
start_date.append(start_date_single)
end_date_single = datetime.strptime(reader_row[7],"%m/%y")
end_date.append(end_date_single)

import json
difference = []
zip_object = zip(end_date, start_date)
with open("remove_ccard.json", 'w', encoding='utf-8') as remove: 
    for end_date, start_date in zip_object:
        difference.append(end_date-start_date)
    for i in difference:
        json.dump([d for d in l if (i) > 10*365.25], remove)

# I WROTE THAT CODE BUT I GET 'datetime.datetime' object is not iterable,

我仍然收到错误消息。你能帮帮我吗?

【问题讨论】:

  • 显示几行 userdata.csv 与您的代码一起用作输入。
  • 我也希望那不是乔纳森·托马斯的真实信用卡信息...

标签: python json csv


【解决方案1】:

改用日期时间

from datetime import datetime

#Replacing d['Credit Card Expiry Date'[-2:]] - d['Credit Card Start Date'[-2:]] > 10
start_date = datetime.strptime(d['Credit Card Start Date'],"%m/%y")
end_date = datetime.strptime(d['Credit Card Expiry Date'],"%m/%y")

当您减去它们时,您会得到天数的差异。然后你的代码的最后一部分将是

with open("remove_ccard.json", 'w', encoding='utf-8') as remove: 
    json.dump([d for d in l if end_date - start_date > 10*365.25], remove)

【讨论】:

  • 感谢您的回答,但我遇到了错误“strptime() 参数 1 必须是 str,而不是 Series”如果我们编写一个 for 循环来单独到达每个项目。
  • 如果 Python 将其解释为 pandas 系列,那么您将使用 d['Credit Card Start Date'].apply(lambda x: datetime.strptime(x, "%y/%m"))
  • 好的,我修复了这个错误,但在转储 json 文件中获取了另一个错误。 "'>' 在 'datetime.timedelta' 和 'float' 的实例之间不支持"
  • 将它们包裹在(your_value).days > 365.25*10
  • 你能检查一下新编辑的问题吗?
【解决方案2】:

将字符串转换为日期时间

from datetime import datetime
start = "08/12"
end = "11/26"
date_time_obj1 = datetime.strptime(start, '%m/%y')
date_time_obj2 = datetime.strptime(end, '%m/%y')
c = date_time_obj1 - date_time_obj2

【讨论】:

  • 你能检查一下新编辑的问题吗?
  • 你可以使用for end_date, start_date in zip(end_date, start_date)new_list = list(zip_object) 然后for first, second in new_list:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2022-07-07
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多