如何正确读取带有日期的csv并在熊猫中省略前导零?

Posted

技术标签:

【中文标题】如何正确读取带有日期的csv并在熊猫中省略前导零?【英文标题】:How to properly read csv with dates and omitted leading zeros in pandas? 【发布时间】:2015-04-15 17:29:59 【问题描述】:

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

caseid   eventdate     constype  consid  employid  delta
4044     13/11/1996    9         2301    3044      0

这是我已经知道的:

    caseidconsidemployid 是 8 位字符串(带有前导零,不会出现在文本文件中) eventdate 是 dd/mm/yyyy 日期 costype 是一个字符串 delta 是一个浮点数

现在,正确读取此 csv/文本以便正确键入所有列的 pandas 语法是什么?

我正在使用这个:

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

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

【问题讨论】:

【参考方案1】:

以下对我有用,您需要将 dict 作为参数传递给dtype,类型应该是可以理解的类型,我会传递str 而不是char,如果你传递参数parse_dates=[1] 而不是试图在 dtypes 中指定它,然后 pandas 内置的日期解析器解析日期字符串就好了。

要填充零,您可以定义一个函数来填充零并将其传递给参数converters,传递列的字典和函数的名称,对于这些列,不需要传递 dtype '将通过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()的输出:

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

【讨论】:

它工作得非常好 - 谢谢 Ed!我也添加了日期解析器(显然,自动解析器不能很好地处理丢失的日期,因此返回字符串:parse_dates = lambda x: date(2020, 1, 1) if x is np.nan else datetime.strptime(str(x),'%d/%m/%Y')

以上是关于如何正确读取带有日期的csv并在熊猫中省略前导零?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫 read_csv dtype 前导零

pgSQL:插入日期格式(前导零)?

为啥熊猫在写入 csv 时会删除前导零?

导出为 CSV 时,如何在列中保留前导零?

如何在熊猫中使用 read_csv 将时区感知日期时间作为时区天真的本地 DatetimeIndex 读取?

如何在熊猫中读取带有分号分隔符的文件