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

Posted

技术标签:

【中文标题】Pandas DataFrame 中两个日期之间的差异【英文标题】:Difference between two dates in Pandas DataFrame 【发布时间】:2016-10-01 17:15:45 【问题描述】:

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

时间的格式是这样的2015-09-25T01:45:34.372Z

我正在使用 Pandas DataFrame。

我想这样做:

df.days = df.out_time - df.in_time

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

【问题讨论】:

Calculate Pandas DataFrame Time Difference Between Two Columns in Hours and Minutes的可能重复 我的问题和你的不同,我有很多列,我必须在其中增加 1 列命名为 days 并将差异放在那里。 【参考方案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

【讨论】:

【参考方案2】:

嗯,这完全取决于您使用的时间格式。我建议使用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)

然后你可以简单地减去它们,并将结果分配给一个名为“天”的新列:

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 格式,请注意我做了一些假设(例如,您使用的是24H 时钟(因此使用%H 而不是@ 987654335@))。要使用该格式,请查看:strptime() documentation。

注意2:如果您可以将程序设计为从一开始就使用datetime(而不是使用字符串并进行转换),这显然会更好。

【讨论】:

同时使用 "f = lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ') df.in_time = df. in_time.apply(f)" 给出错误 "'module' 对象没有属性 'strptime'" ,我该如何解决这个问题 'strptime' 在 datetime.datetime 中,而不仅仅是 datetime;见:***.com/questions/19480028/…

以上是关于Pandas DataFrame 中两个日期之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:在两个日期之间选择 DataFrame 行(日期时间索引)

Pandas Dataframe 保留日期在两个日期之间的行(单独的列)

Pandas Dataframe 合并 2 列,包括条件 If 合并:如果 df_2 中的日期在 df_1 中的其他两个日期之间

如果我有重复的日期,如何用 pandas 中两个日期之间计算的值填充一列?

Pandas Dataframe:在两种完全不同的格式之间转换日期格式[重复]

合并两个日期字段在两个月内的 pandas DataFrame