如何获取pandas.read_csv()以从csv文件列推断datetime和timedelta类型?

2024-04-25 15:04:51 发布

您现在位置:Python中文网/ 问答频道 /正文

pandas.read_csv()推断出列的类型,但我无法让它推断出任何日期时间或时间增量类型(例如,datetime64timedelta64),这些列的值似乎是明显的日期时间和时间增量。

下面是一个CSV文件示例:

datetime,timedelta,integer,number,boolean,string
20111230 00:00:00,one hour,10,1.6,True,Foobar

还有一些与熊猫一起阅读的代码:

dataframe = pandas.read_csv(path)

数据框上的列类型显示为object、object、int、float、bool、object。它们都如我所料,除了前两列,我想是datetime和timedelta。

是否可以让pandas自动检测datetime和timedelta列?

(我不想告诉panda哪些列是datetimes和timedelta,也不想告诉它格式,我想让它像对into、float和bool列那样尝试自动检测它们。)


Tags: csv类型pandasreaddatetimeobject时间float
1条回答
网友
1楼 · 发布于 2024-04-25 15:04:51

您可以做的一件事是使用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]:

然后要转换为时间增量,请使用dict和函数解析并转换为时间增量

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(在0.13.1及更高版本中)时使用strptime而不是使用strptime

df = pd.read_csv(r'c:\temp1.txt', parse_dates=[0], infer_datetime_format=True)

相关问题 更多 >