Pyt*_*ous 8 python csv date pandas
我已经意识到,除非显式或半显式声明日期列的格式(使用 dayfirst),否则在读取 csv 文件时,pandas 可以将不同的日期格式应用于同一列!一行可能是 dd/mm/yyyy,而同一列中的另一行可能是 mm/dd/yyyy! 疯狂甚至无法描述它!这是一个已知的错误吗?
为了演示:下面的脚本创建了一个非常简单的表,其中包含从 1 月 1 日到 31 日的日期,采用 dd/mm/yyyy 格式,将其保存到 csv 文件,然后读回 csv。
然后我使用 pandas.DatetimeIndex 来提取日期。好吧,前 12 天的天数为 1(当月和日都 < 13 时),然后是 13 14 等。这到底怎么可能?
我发现解决此问题的唯一方法是明确声明日期格式或仅使用 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'])
Run Code Online (Sandbox Code Playgroud)
默认情况下,它采用美国日期格式,并且如果失败的话,确实会在列中切换而不会抛出错误。尽管它让这个错误悄无声息地过去,从而破坏了 Python 的禅宗,但“显式优于隐式”。因此,如果您知道您的数据具有国际格式,则可以使用dayfirst
imp = pd.read_csv('mydates.csv', parse_dates=['date'], dayfirst=True)
Run Code Online (Sandbox Code Playgroud)
对于您生成的文件,请使用带有时区指示符的 ISO 8601 格式来明确表达。