【问题标题】:How to specify dtype for pd.read_csv when there are no column headers?没有列标题时如何为 pd.read_csv 指定 dtype?
【发布时间】:2020-05-29 21:10:43
【问题描述】:

我目前正在编写代码来分析大量数据子集。我使用 pandas 读取文本文件,并使用 data.head() 打印它。我需要为 9 列(第 9 列为空)指定 dtype,因为否则该过程会占用大量内存,但我不知道如何为缺少列标题的列指定 dtype。是否与为列标题指定 dtype 相同?作为参考,我的列数据类型可能如下:

第 1 列:混合,因为它包含字母数字字符

第 2 列:格式为 YY/MM/DD 的日期

第 3 列:以小时/分钟/秒/毫秒为单位的时间

第 4 列:Str

第 5 栏:时间

第 6 列:Str

第 7 栏:时间

第 8 栏:时间

第 9 列:空

Here is an excerpt of the text file

这也是我的代码的摘录

    import sys
    import os
    import glob
    import pandas as pd
    import numpy as np

    path = '/Users/MysteriousHo-Oh1231/Downloads/Datapoints1/*.txt'
    dataframes = []
    for filename in glob.iglob(path):
      data = pd.read_csv(filename, header=None, delimiter='\t',  dtype={0: object, 1: int, 2: int, 3: object, 4: int, 5: object, 6: int, 7: int, 8: None})
      print(data.head())

我尝试了上面的代码,它返回了这个error

请帮帮我!

【问题讨论】:

  • python 从 0 开始,而不是 1
  • 首先删除try/except 以查看错误消息,因为您有错误。 IE。它必须是dtype= 没有s,没有变量datetime64np.datetime64 但通常您必须在加载数据后使用data[2] = pd.to_datetime(data[2])
  • 顺便说一句:你必须使用print( data.head() )
  • @furas 是的,我忘记写了,哈哈!我会去做的。谢谢你抓住它!也感谢其他一切!
  • 顺便说一句:您可以将数据添加为文本,然后我们可以使用它来测试想法/代码。

标签: python pandas


【解决方案1】:

定义以下3个转换函数:

def strToDate(tt):
    return pd.to_datetime(tt, yearfirst=True)

def strToTime(tt):
    return pd.to_datetime(tt, format='%I:%M:%S.%f').time()

def strToTime2(tt):
    return pd.Timestamp(float(tt), unit='s').time()

然后读取您的 DataFrame,将它们作为列的转换器传递 需要“专门”转换:

df = pd.read_csv('Input.csv', header=None, converters={ 1: strToDate,
    2: strToTime, 4: strToTime2, 6: strToTime2, 7: strToTime2 })

当你打印df.info(),那么:

  • 1(日期)属于datetime64[ns]类型,
  • 8NaNs)是float64类型,
  • 所有其他列都是 object 类型。

但不要误入歧途。在 Pandas 中,object 的类型实际上意味着 “不是数字或日期时间的东西”。

当您检索 单个 值时,例如df.iloc[0,2]你 将得到:datetime.time(11, 24, 31, 758000),任何单元格都类似 来自 467 列,因此它们只是所需的类型。

基于Timedelta的另一种解决方案

定义转换器函数为:

def strToDate(tt):
    return pd.to_datetime(tt, yearfirst=True)

def strToTimeDelta(tt):
    return pd.Timedelta(float(tt), unit='S')

阅读您的数据框:

df = pd.read_csv('Input.csv', header=None, converters={ 1: strToDate,
    2: pd.Timedelta, 4: strToTimeDelta, 6: strToTimeDelta, 7: strToTimeDelta })

(转换列2使用原生pandasonic函数pd.Timedelta)。

然后,如果您需要转换一些 Timedelta 列(例如列 7) 到总秒数,包括小数部分,运行:

df[7].dt.seconds + df[7].dt.microseconds / 1e6

但是读取列467的默认结果只是 float 即秒数。

它们是概念上时代,但实际上:

  • 在输入文件中,它们被保存为文本
  • read_csv 之后,它们是 浮动 保持秒数。

那么为什么需要对这些列进行任何转换?

【讨论】:

  • 你好。所以对于其余的列,我应该使用对象数据类型而不是任何特殊的转换方法,还是应该不理会它?因为现在我的终端使用 df.info 命令返回 1 列,即使有 9 列。我还想补充一点,我正在使用 for 循环自动为我添加所有文本文件,而不仅仅是使用特定文件。虽然文本文件具有相同的格式,但它不会影响任何东西吧?感谢其他一切!
  • 另外,如果我想使用 numpy 或 scipy 来查找值的平均值,那会影响什么吗?
  • 可以为 numeric 列计算平均值。如果您想要类似 mean 的“类时间”列,那么您可能应该将时间值转换为例如秒数,然后计算平均值(对于每个感兴趣的列)。
  • 我尝试使用to_numeric 函数将其转换为数值,但它不起作用
  • 要将 datetime.time 对象 (tt) 转换为秒数,您可以使用 n = tt 等公式。小时 * 3600 + tt.minute * 60 * tt.second + tt.microsecond / 1e6。其他选择是将我的解决方案转换为将感兴趣的列保留为 Timedelta 并使用其 seconds 属性获取秒数。
猜你喜欢
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多