如何让pandas.read_csv()从CSV文件列中推断出datetime和timedelt
发布时间:2020-12-16 21:31:26 所属栏目:Python 来源:网络整理
导读:pandas.read_csv()推断列的类型,但我不能让它推断出任何日期时间或timedelta类型(例如datetime64,timedelta64),其值似乎是明显的日期时间和时间增量. 这是一个示例CSV文件: datetime,timedelta,integer,number,boolean,string20111230 00:00:00,one hour,10
pandas.read_csv()推断列的类型,但我不能让它推断出任何日期时间或timedelta类型(例如datetime64,timedelta64),其值似乎是明显的日期时间和时间增量.
这是一个示例CSV文件: datetime,timedelta,integer,number,boolean,string 20111230 00:00:00,one hour,10,1.6,True,Foobar 还有一些用pandas读取它的代码: dataframe = pandas.read_csv(path) 该数据框上的列类型分别为object,object,int,float,bool,object.除了前两列之外,它们都是我所期望的,我希望它们是datetime和timedelta. 是否有可能让pandas自动检测datetime和timedelta列? (我不想告诉大熊猫哪些列是datetimes和timedeltas或告诉它格式,我希望它尝试自动检测它们,就像它对into,float和bool列一样.) 解决方法
您可以做的一件事是使用strptime定义您的日期解析器,这将处理您的日期格式,但这不是自动的:
In [59]: import pandas as pd import datetime as dt def parse_dates(x): return dt.datetime.strptime(x,'%Y%m%d %H:%M:%S') # dict for word lookup,conversion word_to_int={'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9} def str_to_time_delta(x): num = 0 if 'hour' in x.lower(): num = x[0:x.find(' ')].lower() return dt.timedelta( hours = word_to_int[num]) df = pd.read_csv(r'c:temp1.txt',parse_dates=[0],date_parser=parse_dates) df.dtypes Out[59]: datetime datetime64[ns] timedelta object integer int64 number float64 boolean bool string object dtype: object In [60]: 然后转换为timedeltas使用dict和函数来解析并转换为timedeltas df['timedelta'] = df['timedelta'].map(str_to_time_delta) In [61]: df.dtypes Out[61]: datetime datetime64[ns] timedelta timedelta64[ns] integer int64 number float64 boolean bool string object dtype: object In [62]: df Out[62]: datetime timedelta integer number boolean string 0 2011-12-30 00:00:00 01:00:00 10 1.6 True Foobar [1 rows x 6 columns] 要回答您的主要问题,我不知道如何自动执行此操作. 编辑 而不是我复杂的映射功能,你可以这样做: df['timedelta'] = pd.to_timedelta(df['timedelta']) 进一步编辑 正如@Jeff所述,你可以在阅读csv时使用strptime而不是使用strptime(虽然版本在0.13.1及更高版本中): df = pd.read_csv(r'c:temp1.txt',infer_datetime_format=True) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |