【问题标题】:A simple maths operation on a CSV column using python [closed]使用 python 对 CSV 列进行简单的数学运算 [关闭]
【发布时间】:2021-11-13 22:35:47
【问题描述】:

所以我有一个需要插入 API 的 CSV 文件,但其中一列是以美元为单位的,我想通过乘以 100 将其转换为美分

这是文件

tripId,scooterId,userId,totalDuration,pickUpTime,dropOffTime,userLocationAtBooking.0,userLocationAtBooking.1,userLocationAtDropOff.0,userLocationAtDropOff.1,totalFare
18721,927,38579,45,2021-08-22 03:00:49,2021-08-22 03:45:39,24.76412,46.6493,24.76409833,46.64934,9.58
18722,434,38563,45,2021-08-22 03:01:16,2021-08-22 03:45:39,24.76412,46.64933333,24.76407,46.64933333,13.53
18723,876,38554,33,2021-08-22 03:05:57,2021-08-22 03:38:55,24.71392833,46.660645,24.7097,46.66272,0.67
18724,476,32291,65,2021-08-22 03:14:37,2021-08-22 04:18:56,24.77137833,46.64568667,24.7722,46.64523167,32.35

我只需要对最后一列“totalFare”进行数学运算

我还是 python 新手,所以任何帮助都将不胜感激。

【问题讨论】:

  • 我现在很困惑。如果将美元乘以 100,仍然是数百美元。 Edit。我现在明白了。由于它是简单的数学运算,stackoverflow 上有很多操作。请参考。
  • 从阅读有关在 python 中处理 csv 的内容开始,例如realpython.com/python-csv 如果您不知道从哪里开始。您还没有尝试为您的问题找到解决方案。
  • 好吧,但现在是美分

标签: python python-3.x csv


【解决方案1】:

如果仍然不清楚如何执行任务,这里是使用基本 Python 的实现

with open('file.csv', 'r') as in_file, open('result.csv', 'w') as out_file: # Open input and output files
    out_file.write(next(in_file))                # Reads header from input file and writes to output file
    for line in in_file:                         # For each line in file (we are past header line)
        line = line.rstrip().split(',')          # Create list from comma separated string
        line[-1] = f'{100*float(line[-1]):.0f}'  # Convert last item in list to float and multiply by 100
                                                 # and convert foat to stringto 0 decimal places
            
        #line[-1] = '{:.0f}'.format(100*float(line[-1])) # Alternative to above line that doesn't use
                                                         # f-string (i.e. can use in earlier versions of Python)  
        
        out_file.write(','.join(line) + '\n')    # Output updated list as comma separated string
    

输出(使用示例输入)

tripId,scooterId,userId,totalDuration,pickUpTime,dropOffTime,userLocationAtBooking.0,userLocationAtBooking.1,userLocationAtDropOff.0,userLocationAtDropOff.1,totalFare
18721,927,38579,45,2021-08-22 03:00:49,2021-08-22 03:45:39,24.76412,46.6493,24.76409833,46.64934,958
18722,434,38563,45,2021-08-22 03:01:16,2021-08-22 03:45:39,24.76412,46.64933333,24.76407,46.64933333,1353
18723,876,38554,33,2021-08-22 03:05:57,2021-08-22 03:38:55,24.71392833,46.660645,24.7097,46.66272,67
18724,476,32291,65,2021-08-22 03:14:37,2021-08-22 04:18:56,24.77137833,46.64568667,24.7722,46.64523167,3235

使用 Python Pandas 模块的替代方案(更短的解决方案)

import pandas as pd

df = pd.read_csv('file.csv')               # Read CSV file into Pandas DataFrame
df['totalFare'] *= 100                     # multiply total_fare by 100
df.to_csv('result.csv', index = False)     # Write to output file as csv

【讨论】:

  • @l4mpi --yes 我熟悉 CSV 库并且经常使用它。但是,这里的操作如此简单,使用它有什么意义呢?你知道它会如何改进我的代码吗?
  • 首先,使用 DictReader/Writer 会简化您的代码。其次,如果出现任何重要的 CSV 功能(例如引用或多行记录),您的代码将会失败。没有理由不对 CSV 数据使用 CSV 库。
  • @l4mpi - 您的示例超出了 OP 的问题案例。 OP 的文件不使用引用或多行记录。如果是这样,那么是的,CSV 将是要走的路。您为什么不发布一个答案,说明如何使用 CSV DictReader 来解决这个特定问题?
  • 正如我所说,OPs 4 提供的数据行是否可以用您的方法解析并不重要,尝试手动解析 CSV 只是一个很大的反模式(而不是验证标头,以及 - 如果列顺序更改,您的代码也会失败)。至于我自己发布答案,我不会回答 OP 似乎没有投入任何精力来解决他们自己的问题的问题。
  • @l4mpi -- 正如 Python 之禅所说的“简单胜于复杂。”。我相信这是解决问题的最简单答案,正如 OP 所说。这很简单,因为它处理指定的问题,使用最简单的 Python 构建块,并且不强迫他/她学习另一个模块。
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多