【问题标题】:How to read an Excel spreadsheet and convert units?如何阅读 Excel 电子表格并转换单位?
【发布时间】:2020-02-22 06:31:24
【问题描述】:

我有一个 Excel 电子表格,我想使用 python 将测量值从 cm3/day 转换为 cm3/year。

有没有办法做到这一点? 我主要研究了 openpyxl,因为这个模块似乎最适合 excel 编辑,但我想我对如何编辑单位很困惑,所以它们都是一样的......我似乎找不到支持我正在尝试做的模块。

【问题讨论】:

  • 您可以将该列读取为字符串并将“cm3/sec”替换为“cm3/year”。

标签: python excel converters


【解决方案1】:

如果文件是“*.xlsx”格式,你可以像这样在python中读取文件:

#first import necessary packages
import pandas as pd
import numpy as np

data = pd.read_excel(file_name)

如果是 "*.csv" 格式,请执行以下操作:

#first import necessary packages
import pandas as pd
import numpy as np

data = pd.read_csv(file_name)

要对列执行计算(cm3/day/sec--这种格式我不明白,但如果你有 cm3/day,你可以通过下面的代码将它转换为 cm3/year)

#first check the type of your column
data["column"].dtype

#based on what you get as type

#If your column's data type is string
#convert it to integer
data["column_name"] = data["column_name"].astype(int)
#convert it to float
data["column_name"] = data["column_name"].astype(float)


# if your column is already of numeric type don't change it

#to convert cm3/day to cm3/year
data["column_name"] = data["column_name"]*365

PS:我看不到链接的图像,所以我无法在 Excel 表中使用有效的列名

【讨论】:

  • 您好,感谢您的回复!抱歉,我的帖子有点不清楚,我的意思是记录显示 cm3/day 和 cm3/sec,我想将它们全部转换为 cm3/year。我尝试重新添加图像,希望它现在可见。
  • @avocado23 如果您的列值以 cm3/天为单位,您可以将该列乘以 365(如上面的代码),它会给您 cm3/年。我这边图片的问题是我住的地方 imgur 被阻止了:/ 也许您可以使用此网站(imggmi.com)上传您的图片并将其转换为链接,然后您可以将您的图片添加到您的问题中,如下所示: ![image_name](您从网站获得的 image_link)。要上传您的图片,请在您的笔记本电脑中点击概览浏览图片,然后点击上传,您将获得许多链接,但您可以使用第一个)
【解决方案2】:

您可以使用 pandas 轻松完成此操作。您可能需要安装 xlrd: pip3 install pandas xlrd
或者只是将您的文件保存为 csv。

import pandas as pd
# Read the file with read_csv() or read_excel()
df = pd.read_excel('your_file.xlsx', index_col=0)  # Your index is the first column
>>> df
         measure  amount
precip                  
1        cm3/day      45
2        cm3/day     132
3       cm3/year    9565
4        cm3/sec       5
5        cm3/day      67
6        cm3/day      52
7        cm3/sec       2
8        cm3/day      78
9        cm3/sec       3
10       cm3/day      92

然后你可以使用 apply() 来检查和更新你想要的值。这会将任何函数应用于 pd.DataFrame 的每一行,选项为 axis=1。应用函数接收一行数据作为 pd.Series 对象。
让我们定义一个函数:

def _update(serie):
    val = serie['amount']  # The original value
    volume, time = serie['measure'].split('/') # The time unit
    # Check and update
    if time == 'year':
        return serie
    elif time == 'day':
        serie['amount'] = val * 365
    elif time == 'hour':
        serie['amount'] = val * 24 * 365
    elif time == 'sec':
        serie['amount'] = val * 3600 * 24 * 365
    # Update measure col
    serie['measure'] = 'cm3/year'

    return serie

然后应用函数:

new_df = df.apply(_update, axis=1)
>>> new_df
         measure     amount
precip                     
1       cm3/year      16425
2       cm3/year      48180
3       cm3/year       9565
4       cm3/year  157680000
5       cm3/year      24455
6       cm3/year      18980
7       cm3/year   63072000
8       cm3/year      28470
9       cm3/year   94608000
10      cm3/year      33580

# Save de new file:
new_df.to_excel('new_file.xlsx')

希望这会有所帮助!

【讨论】:

  • 你能发布错误吗?我想这是因为你的 measure 列(你必须检查与该字段相关的所有内容,你可能需要 str.strip( ) ;我的意思是错误可能出现在 "if time == "...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多