pandas.read_csv() 可以在同一列中应用不同的日期格式!这是一个已知的错误吗?如何解决?
Posted
技术标签:
【中文标题】pandas.read_csv() 可以在同一列中应用不同的日期格式!这是一个已知的错误吗?如何解决?【英文标题】:pandas.read_csv() can apply different date formats within the same column! Is it a known bug? How to fix it? 【发布时间】:2019-08-14 00:08:43 【问题描述】:我已经意识到,除非明确或半明确地声明日期列的格式(使用 dayfirst),pandas 在读取 csv 文件时可以将不同的日期格式应用于同一列!一行可以是 dd/mm/yyyy,另一行在同一列 mm/dd/yyyy! 疯狂甚至无法描述它!这是一个已知的错误吗?
为了演示:下面的脚本创建了一个非常简单的表格,日期从 1 月 1 日到 31 日,格式为 dd/mm/yyyy,将其保存到 csv 文件,然后读回 csv。
然后我使用 pandas.DatetimeIndex 来提取日期。 好吧,前 12 天的日期为 1(当月份和日期均
我发现解决此问题的唯一方法是声明日期格式,显式或仅使用 dayfirst=True。但这很痛苦,因为这意味着即使我导入具有最佳格式日期的 csv,我也必须声明日期格式!有没有更简单的方法?
Windows 10 上的 pandas 0.23.4 和 Python 3.7.1 发生在我身上
import numpy as np
import pandas as pd
df=pd.DataFrame()
df['day'] =np.arange(1,32)
df['day']=df['day'].apply(lambda x: ":0>2d".format(x) )
df['month']='01'
df['year']='2018'
df['date']=df['day']+'/'+df['month']+'/'+df['year']
df.to_csv('mydates.csv', index=False)
#same results whether you use parse_dates or not
imp = pd.read_csv('mydates.csv',parse_dates=['date'])
imp['day extracted']=pd.DatetimeIndex(imp['date']).day
print(imp['day extracted'])
【问题讨论】:
我过去也遇到过这个问题,但我不记得我是如何解决的。我认为值得提出一个问题 这显然是近 3 年的已知问题:github.com/pandas-dev/pandas/issues/12585 我无语了。同一字段中的不同日期格式... AFAIK 解决此问题的唯一方法是明确声明日期格式。请参阅以下地址的讨论:github.com/pandas-dev/pandas/issues/… 这是一个巨大的问题,可能会破坏大量用户多年的工作。 @Pythonistaanonymous:这是一个非常有价值的自我回答,请写下来并接受它。底线是试图推断日期和用户日期格式是错误的。所以明确指定格式。 【参考方案1】:默认情况下,它采用美国日期格式,并且如果失败,确实会在不引发错误的情况下切换中间列。尽管它通过让这个错误静默传递而打破了 Python 的禅宗,但“显式优于隐式”。所以如果你知道你的数据有国际格式,你可以使用dayfirst
imp = pd.read_csv('mydates.csv', parse_dates=['date'], dayfirst=True)
对于您生成的文件,请使用带有时区指示符的 ISO 8601 格式来明确。
【讨论】:
我不认为这是一个有见地的答案。它没有添加任何内容,也没有解释如何解决问题,只是将其重要性降至最低。 我同意这个错误很烦人,但我认为这是一个可以接受的解决方案。正如 Chris 所提到的,您应该始终明确定义日期格式,否则即使数据完美,您也会遇到问题。只有当日期大于 12 天时,机器才能可靠地猜测日期具有某种格式,但情况可能并非总是如此。以上是关于pandas.read_csv() 可以在同一列中应用不同的日期格式!这是一个已知的错误吗?如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
pandas.read_csv 将字符串转换为科学记数法中的“数字”(我不想要)
Pandas read_csv 用字符串“nan”填充空值,而不是解析日期