如何查找数据框操作的两个日期之间的天数

时间:2015-10-27 19:48:33

标签: python date pandas

如何查找df1中所有特定开始日期范围与df2中相应结束日期之间的天数。然后将df1中的特定行除以特定行中的天数(包括特定kWh值的除法,并写入if到df1)。

例如:

DF1:

      64           65      START DATE
0     54.37        65.37   2013-05-03 00:00:00
1     43.52        51.23   2013-06-05 00:00:00 

DF2:

    Start Date  End Date     kWh 
 0  5/3/2013    6/5/2013     59,120 
 1  6/5/2013    7/2/2013     60,400 

更新了df1:

      64           65           kWh       START DATE
0     1.647575758  1.980909091  1791.51   2013-05-03 00:00:00   # all columns except date is divided by 33
1     1.611851852  1.897407407  2237.037  2013-06-05 00:00:00   # all columns except date is divided by 27

33是df1开始日期5/3/2013之间的天数& df2截止日期6/5/2013

27是df1开始日期6/5/2013和之间的天数。 df2截止日期7/2/2013

我将如何做到这一点?

2 个答案:

答案 0 :(得分:1)

加入两个数据帧,转换为datetime并减去:

import pandas as pd
df = pd.DataFrame({'Start Date':['5/3/2013', '6/5/2013'], 'End Date':['6/5/2013', '7/2/2013'], 'kWh':[59120, 60400]})
pd.to_datetime(df['Start Date']) - pd.to_datetime(df['End Date'])

结果:

0   -33 days
1   -27 days
dtype: timedelta64[ns]

如果你想要这些日子:

df['delta'] = pd.to_datetime(df['Start Date']) - pd.to_datetime(df['End Date'])
df.delta.dt.days

答案 1 :(得分:1)

首先,将所有日期转换为时间戳:

# Sample Data.
df1 = pd.DataFrame({64: [54.37, 43.52], 65: [65.37, 51.23], 'START DATE': ['2013-05-03 00:00:00', '2013-06-05 00:00:00']})
df2 = pd.DataFrame({'Start Date': ['5/3/2013', '6/5/2013'], 'End Date': ['6/5/2013', '7/2/2013'], 'kWh': [59120, 60400]})

# Convert dates to timestamps.
df1['START DATE'] = pd.to_datetime(df1['START DATE'])
df2['Start Date'] = pd.to_datetime(df2['Start Date'])
df2['End Date'] = pd.to_datetime(df2['End Date'])

现在,加入End Date df2df1

df1 = df1.merge(df2[['Start Date', 'End Date', 'kWh']], 
                how='left', left_on='START DATE', right_on='Start Date')

计算开始日期和结束日期之间的天数:

days = (df1['End Date'] - df1['START DATE']) / pd.offsets.Day(1)

让我们清理合并后的数据:

df1.drop(['Start Date', 'End Date'], axis='columns', inplace=True)

最后,一些体操将df除以计算的天数:

df1.update((df1[[64, 65, 'kWh']].T / days.values).T)
>>> df1
         64        65 START DATE          kWh
0  1.647576  1.980909 2013-05-03  1791.515152
1  1.611852  1.897407 2013-06-05  2237.037037