pandas.read_csv()推断出列的类型,但我不能让它推断出任何日期时间或时间点类型(例如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列一样。)
答案 0 :(得分:3)
您可以做的一件事是使用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
(虽然在版本0.13.1及更高版本中):
df = pd.read_csv(r'c:\temp1.txt', parse_dates=[0], infer_datetime_format=True)
答案 1 :(得分:0)
这就是我如何将它用于日期时间格式的多列。
parse_dates=['Start-time', 'End-time', 'Manufacturing date',
'Expiry Date'], infer_datetime_format=True
infer_datetime_format=True
很好,因为它会忽略任何不是日期时间格式的列。这让我觉得如果有一种方法可以将代码应用于 csv 文件中的所有列可能会很好。特别是如果您有 30 或更多列将 dtypes
声明为日期时间。但是,它不适用于 timedelta64。