我已经意识到,除非日期列的格式被显式或半显式地声明(使用dayfirst),熊猫在读取csv文件时可以将不同的日期格式应用于同一列!一行可能是dd/mm/yyyy,另一行可能在同一列mm/dd/yyyy!癫狂甚至都没有描述它!是已知的窃听器吗?
为了演示:下面的脚本创建了一个非常简单的表,其日期为1月1日至31日,格式为dd/mm/yyyy,将其保存到csv文件中,然后读取csv。
然后,我使用pandas.DatetimeIndex提取一天。嗯,前12天是1天(月和日都< 13),之后是1314等等。这到底是怎么可能的?
解决这个问题的唯一方法是显式地或仅使用dayfirst=True声明日期格式。但这是一个痛苦,因为这意味着我必须声明日期格式,即使当我导入csv与最好的格式日期!有更简单的方法吗?
在Windows 10环境下,熊猫0.23.4和Python3.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'])
发布于 2021-07-28 17:17:35
默认情况下,它采用美国的日期格式,如果操作失败,它实际上会切换到中间列,而不会引发错误。虽然它打破了Python的禅意,让这个错误悄悄地传递,但是“显式比隐式好”。因此,如果您知道您的数据具有国际格式,则可以使用dayfirst
imp = pd.read_csv('mydates.csv', parse_dates=['date'], dayfirst=True)
对于您生成的文件,请使用带有时区指示符的ISO 8601格式进行明确处理。
https://stackoverflow.com/questions/55309199
复制相似问题