【问题标题】:How do i convert one column from an imported csv using numpy from string to float?如何使用numpy将导入的csv中的一列从字符串转换为浮点数?
【发布时间】:2020-10-07 05:03:13
【问题描述】:

我有两个使用 numpy 导入到 python 的 csv 文件。
数据有 2 列:

[['month' 'total_rainfall']        
 ['1982-01' '107.1']    
 ['1982-02' '27.8']    
 ['1982-03' '160.8']    
 ['1982-04' '157']    
 ['1982-05' '102.2']   

我需要创建一个二维数组并使用“total_rainfall”列计算统计数据。 (平均值、标准差、最小值和最大值)

所以我有这个:

import numpy as np    
datafile=np.genfromtxt("C:\rainfall-monthly-total.csv",delimiter=",",dtype=None,encoding=None)    
print(datafile)    
rainfall=np.asarray(datafile).astype(np.float32)    
print (np.mean(datafile,axis=1)) 

ValueError:无法将字符串转换为浮点数:'2019-04'

【问题讨论】:

  • 您需要指定names=True。然后看数组。它应该有 2 个字段,第二个是数字。

标签: python numpy genfromtxt


【解决方案1】:

将str转换为float如下:

>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

错误消息显示问题是将2019-04 转换为浮点数。

当您想将2019-04 转换为浮点数时,它不起作用,因为浮点数之间没有-。这就是你出错的原因。

【讨论】:

    【解决方案2】:

    您可以将降雨值转换为floatint,但无法转换日期。要将日期转换为int,您必须拆分字符串并将其组合为日期格式,然后将其转换为毫秒:

    from datetime import datetime
    
    month1 = '1982-01' 
    date = datetime(month1.split('-')[0], month1.split('-')[1], 1)
    milliseconds = int(round(date.timestamp() * 1000))
    

    这样,您假定它是当月的第一个日期。

    【讨论】:

      【解决方案3】:

      您的错误消息显示无法将字符串转换为浮点数, 但实际上你的问题有点不同。

      您的数组包含 string 列,应进行转换:

      • - 到期间(月),
      • total_rainfall - 浮动

      不幸的是,创建了 Numpy 来处理所有 单元格是相同的类型,所以更方便的工具是 Pandas, 其中每一列都可以是其自己的类型。

      首先,将您的 Numpy 数组(我假设 arr)转换为 pandasonic 数据框:

      import pandas as pd
      
      df = pd.DataFrame(arr[1:], columns=arr[0])
      

      我从初始行获取列名,并从 以下行。打印 df 以查看结果。

      到目前为止,两列仍然是 object 类型(实际上是 string), 所以唯一要做的就是转换两列, 每个到它想要的类型:

      df.month = pd.PeriodIndex(df.month, freq='M')
      df.total_rainfall = df.total_rainfall.astype(float)
      

      现在,当您运行 df.info() 时,您将看到两者 列的类型正确。

      要处理您的数据,也可以使用 Pandas。这是一个更方便的工具。

      例如要获得季度总和,您可以运行:

      df.set_index('month').resample('Q').sum()
      

      获取(用于您的数据样本):

              total_rainfall
      month                 
      1982Q1           295.7
      1982Q2           259.2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-06
        • 2011-07-18
        • 2019-10-31
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        • 2011-04-22
        相关资源
        最近更新 更多