【问题标题】:How to find the number of days between two dates for dataframe manipulation如何查找两个日期之间的天数以进行数据框操作
【发布时间】:2015-10-27 19:48:33
【问题描述】:

如何查找 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 开始日期 2013 年 5 月 3 日和 df2 结束日期 2013 年 6 月 5 日之间的天数

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

我该怎么做呢?

【问题讨论】:

  • df1df2 有什么关系?
  • @ako,df1 和 df2 的开始日期范围相同
  • 所以要明确——开始日期是一个潜在的加入字段?您将开始日期视为一个范围?
  • @ako,我想确定 df1 的开始日期和 df2 的结束日期之间的天数,参考他们共同的开始日期。

标签: python date pandas


【解决方案1】:

加入两个数据框,转换为日期时间并减去:

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

【讨论】:

    【解决方案2】:

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

    # 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'])
    

    现在,加入从df2df1End Date

    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
    

    【讨论】:

    • 如果我每个 64,65,66.....80 列有大量列,那么实现 df1.update((df1[[64, 65, 'kWh']].T / days.values).T) 的最有效方法是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2016-03-15
    相关资源
    最近更新 更多