如何正确读取带有日期的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
这是我已经知道的:
caseid
、consid
和 employid
是 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并在熊猫中省略前导零?的主要内容,如果未能解决你的问题,请参考以下文章