Pandas DataFrame中两个日期之间的差异

时间:2016-06-02 06:04:56

标签: python-2.7 pandas dataframe machine-learning

我在数据框中有很多列,我必须在名为in_timeout_time的两列中找到时间差,并将其放在同一数据框的新列中。< / p>

时间格式如下2015-09-25T01:45:34.372Z

我正在使用Pandas DataFrame。

我想这样做:

df.days = df.out_time - df.in_time


我有很多列,我必须在其中增加1个列名为days并将差异放在那里。

2 个答案:

答案 0 :(得分:1)

您需要将字符串转换为datetime dtype,然后您可以减去所需的任意日期以及生成的系列调用dt.days

In [15]:
df = pd.DataFrame({'date':['2015-09-25T01:45:34.372Z']})
df

Out[15]:
                       date
0  2015-09-25T01:45:34.372Z

In [19]:
df['date'] = pd.to_datetime(df['date'])
df['day'] = (df['date'] - dt.datetime.now()).dt.days
df

Out[19]:
                     date  day
0 2015-09-25 01:45:34.372 -252

答案 1 :(得分:0)

嗯,这完全取决于你使用的时间格式。我建议使用datetime

如果in_timeout_time当前是字符串,请使用datetime.strptime()转换它们:

from datetime import datetime

f = lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ')
df.in_time = df.in_time.apply(f)
df.out_time = df.out_time.apply(f)

然后您可以简单地减去它们,并将结果分配给名为&#39; days&#39;的新列:

df['days'] = df.out_time - df.in_time

示例:(3秒和1天的差异)

In[5]: df = pd.DataFrame({'in_time':['2015-09-25T01:45:34.372Z','2015-09-25T01:45:34.372Z'],
                          'out_time':['2015-09-25T01:45:37.372Z','2015-09-26T01:45:34.372Z']})
In[6]: df
Out[6]: 
                    in_time                  out_time
0  2015-09-25T01:45:34.372Z  2015-09-25T01:45:37.372Z
1  2015-09-25T01:45:34.372Z  2015-09-26T01:45:34.372Z

In[7]: type(df.loc[0,'in_time'])
Out[7]: str

In[8]: df.in_time = df.in_time.apply(lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ'))   
In[9]: df.out_time = df.out_time.apply(lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ'))

In[10]: df    # notice that it looks exactly the same, but the type is different
Out[10]: 
                  in_time                  out_time
0 2015-09-25 01:45:34.372  2015-09-25T01:45:37.372Z
1 2015-09-25 01:45:34.372  2015-09-26T01:45:34.372Z

In[11]: type(df.loc[0,'in_time'])
Out[11]: pandas.tslib.Timestamp

创建新专栏:

In[12]: df['days'] = df.out_time - df.in_time
In[13]: df
Out[13]: 
                  in_time                out_time            days
0 2015-09-25 01:45:34.372 2015-09-25 01:45:37.372 0 days 00:00:03
1 2015-09-25 01:45:34.372 2015-09-26 01:45:34.372 1 days 00:00:00

现在您可以使用输出格式了。例如,秒差的部分:

In[14]: df.days = df.days.apply(lambda x: x.total_seconds()/60)
In[15]: df
Out[15]: 
                  in_time                out_time     days
0 2015-09-25 01:45:34.372 2015-09-25 01:45:37.372     0.05
1 2015-09-25 01:45:34.372 2015-09-26 01:45:34.372  1440.00

注意:关于in_timeout_time格式,请注意我做了一些假设(例如,您使用24小时时钟(因此使用) %H而非%I))。要使用该格式,请查看:strptime() documentation

注2:如果您可以将程序设计为从头开始使用datetime(而不是使用字符串并转换它们),那显然会更好。