Pandas DataFrame 中两个日期之间的差异
Posted
技术标签:
【中文标题】Pandas DataFrame 中两个日期之间的差异【英文标题】:Difference between two dates in Pandas DataFrame 【发布时间】:2016-10-01 17:15:45 【问题描述】:我在一个数据框中有很多列,我必须在名为in_time
和out_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_time
和out_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_time
和out_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 中两个日期之间计算的值填充一列?