自动识别pandas中的日期时间

时间:2017-08-08 06:18:53

标签: python pandas datetime

我试图减去两个时间序列以获得时间差异。

train.csv 中的源数据类似于

id,vendor_id,pickup_datetime,dropoff_datetime
id2875421,2,2016-03-14 17:24:55,2016-03-14 17:32:30
id2377394,1,2016-06-12 00:43:35,2016-06-12 00:54:38

我的代码是

train = pd.read_csv('./train.csv')
out = train.dropoff_datetime[0:5] - train.dropoff_datetime[0:5]

我收到的错误以:

结尾
TypeError: unsupported operand type(s) for -: 'str' and 'str'

大概这是因为datetime列存储为对象或字符串而不是datetime对象。在某些安装中,pandas能够自动识别诸如此类的日期列。怎么设置?我的经验是,大熊猫不可预知地以不同的格式识别日期列。我究竟做错了什么?提前谢谢。

我在jupyter笔记本中使用Python 3.6和pandas 0.20。

3 个答案:

答案 0 :(得分:1)

train = pd.read_csv('./train.csv')
>>>> train.assign(out=pd.to_datetime(train.dropoff_datetime) - pd.to_datetime(train.pickup_datetime))
          id  vendor      pickup_datetime     dropoff_datetime      out
0  id2875421       1  2016-03-14 17:24:55  2016-03-14 17:32:30 00:07:35
1  id2377394       2  2016-06-12 00:43:35  2016-06-12 00:54:38 00:11:03

答案 1 :(得分:0)

在pandas中无法自动解析日期时间列而不指定它们。

您需要按read_csv中参数parse_dates中的位置定义用于解析日期时间的列:

train = pd.read_csv('./train.csv', parse_dates=[2,3])

或按列名称:

train = pd.read_csv('./train.csv', parse_dates=['pickup_datetime','dropoff_datetime'])
print (train.dtypes)
id                          object
vendor_id                    int64
pickup_datetime     datetime64[ns]
dropoff_datetime    datetime64[ns]
dtype: object

out=train.dropoff_datetime[0:5]-train.pickup_datetime[0:5]
print (out)
0   00:07:35
1   00:11:03
dtype: timedelta64[ns]

对于新专栏:

train['difference']=train.dropoff_datetime-train.pickup_datetime
print (train)
          id  vendor_id     pickup_datetime    dropoff_datetime difference
0  id2875421          2 2016-03-14 17:24:55 2016-03-14 17:32:30   00:07:35
1  id2377394          1 2016-06-12 00:43:35 2016-06-12 00:54:38   00:11:03

答案 2 :(得分:0)

@jezrael的答案很好。

此外,以下内容也可行。

train = pd.read_csv('./train.csv')
train['dropoff_datetime'] = pd.to_datetime(train.dropoff_datetime)
train['pickup_datetime'] = pd.to_datetime(train.pickup_datetime)