Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确读取带有日期和省略前导零的csv?_Python_Date_Datetime_Csv_Pandas - Fatal编程技术网

Python 如何正确读取带有日期和省略前导零的csv?

Python 如何正确读取带有日期和省略前导零的csv?,python,date,datetime,csv,pandas,Python,Date,Datetime,Csv,Pandas,我正在尝试读取具有以下结构的csv/txt文件: caseid eventdate constype consid employid delta 4044 13/11/1996 9 2301 3044 0 这是我已经知道的: caseid、consid和employid是8位字符串(前导零不会出现在文本文件中) eventdate是一个dd/mm/yyyy日期 cotype是一个字符串 delta是一个浮点数 现在,正确读取此cs

我正在尝试读取具有以下结构的csv/txt文件:

caseid   eventdate     constype  consid  employid  delta
4044     13/11/1996    9         2301    3044      0
这是我已经知道的:

  • caseid
    consid
    employid
    是8位字符串(前导零不会出现在文本文件中)
  • eventdate
    是一个dd/mm/yyyy日期
  • cotype
    是一个字符串
  • delta
    是一个浮点数
  • 现在,正确读取此csv/文本以正确键入所有列的语法是什么

    我用的是:

    pd.read_csv(path, 
                types = {'caseid': np.char,
                         'eventdate': np.datetime64,
                         'constype': np.char,
                         'consid': np.char,
                         'employid': np.char,
                         'delta': np.float16})
    

    但是这不能考虑日期和前导零-任何想法/建议/帮助都将不胜感激。

    以下内容对我有效,你需要将dict作为参数传递给
    dtype
    ,类型应该是可以理解的类型,我将传递
    str
    ,而不是
    char
    ,另外,如果您传递param
    parse_dates=[1]
    而不是试图在数据类型中指定它,那么内置的日期解析器会很好地解析日期字符串

    要填充零,您可以定义一个函数来填充零,并将其传递给param
    转换器,传递列的dict和函数的名称,对于这些列,无需传递数据类型,因为它将由
    padZeros
    转换为
    str
    来推断:

    def padZeros(x):
        return str(x).zfill(8)
    
    df = pd.read_csv(path, sep='\s+', dtype = {'constype': str,
                         'delta': np.float16}, parse_dates=[1],
                         converters={'caseid':padZeros,
                                     'consid':padZeros,
                                     'employid':padZeros})
    
    来自
    df.info()
    的输出:


    它工作得非常好-谢谢Ed!我还添加了日期分析器(显然,自动分析器不能很好地处理丢失的日期,因此返回字符串:
    parse_dates=lambda x:date(2020,1,1),如果x是np.nan else datetime.strtime(str(x),“%d/%m/%Y”)
    Int64Index: 1 entries, 0 to 0
    Data columns (total 6 columns):
    caseid       1 non-null object
    eventdate    1 non-null datetime64[ns]
    constype     1 non-null object
    consid       1 non-null object
    employid     1 non-null object
    delta        1 non-null float16
    dtypes: datetime64[ns](1), float16(1), object(4)
    memory usage: 50.0+ bytes
    None
    
    In [19]:
    
    df
    Out[19]:
         caseid  eventdate constype    consid  employid  delta
    0  00004044 1996-11-13        9  00002301  00003044      0