【问题标题】:How do I calculate time difference in days or months in python3如何在python3中计算天或月的时差
【发布时间】:2021-10-28 21:11:07
【问题描述】:

我一直在使用 Pandas、BeautifulSoup 和其他一些库在 Python3 上进行抓取和 EDA 项目,并希望使用两个日期之间的时间差进行一些分析。我想确定开始日期和结束日期之间的天数(或者几个月甚至几年,如果这样会更容易的话),并且被卡住了。我有两列(播出开始日期、播出结束日期),日期格式如下:MM-YYYY(比如 01-2021)。我基本上想用结束日期和开始日期之间的时间差制作第三列(这样我可以在以后的分析中使用它)。

# split air_dates column into start and end date

dateList = df["air_dates"].str.split("-", n = 1, expand = True)
df['air_start_date'] = dateList[0]
df['air_end_date'] = dateList[1]
df.drop(columns = ['air_dates'], inplace = True)
df.drop(columns = ['rank'], inplace = True)

# changing dates to numerical notation
df['air_start_date'] = pds.to_datetime(df['air_start_date'])
df['air_start_date'] = df['air_start_date'].dt.date.apply(lambda x: x.strftime('%m-%Y') if pds.notnull(x) else npy.NaN)

df['air_end_date'] = pds.Series(df['air_end_date'])
df['air_end_date'] = pds.to_datetime(df['air_end_date'], errors = 'coerce')
df['air_end_date'] = df['air_end_date'].dt.date.apply(lambda x: x.strftime('%m-%Y') if pds.notnull(x) else npy.NaN)

df.isnull().sum()
df.dropna(subset = ['air_end_date'], inplace = True)

def time_diff(time_series):
    return datetime.datetime.strptime(time_series, '%d')
df['time difference'] = df['air_end_date'].apply(time_diff) - df['air_start_date'].apply(time_diff)

最后四行是我尝试获取时差,但我收到一条错误消息,提示“ValueError:未转换的数据仍然存在:-2021”。任何帮助将不胜感激,因为这已经让我坚持了很长时间。谢谢!

【问题讨论】:

  • 在您对它进行任何操作之前,您能否展示一个 df["air_dates"] 的外观示例?
  • 这是每行内容的示例:2009 年 4 月 - 2010 年 7 月。

标签: python python-3.x pandas datetime timedelta


【解决方案1】:

据我所知,如果你有开始日期和时间和结束日期和时间,那么你可以在 python 中使用 datetime 模块。

要使用它,将使用类似这样的东西:

import datetime

# variable = datetime(year, month, day, hour, minute, second)

start = datetime(2017,5,8,18,56,40)

end = datetime(2019,6,27,12,30,58)

print( start - end )   # this will print the difference of these 2 date and time

希望这个答案对你有所帮助。

【讨论】:

    【解决方案2】:

    好的,我想通了。在倒数第二行中,我将 %d 替换为 %m-%Y ,现在它使用两个日期之间的天数填充新列。我认为运行 strptime 时格式需要保持一致,这就是导致该错误的原因。

    【讨论】:

      【解决方案3】:

      这是一个稍微清理过的版本;从结束日期减去开始日期得到时间增量,然后从中获取days 属性。

      前:

      import pandas as pd
      
      df = pd.DataFrame({'air_dates': ["Apr 2009 - Jul 2010", "not a date - also not a date"]})
      
      df['air_start_date'] = df['air_dates'].str.split(" - ", expand=True)[0]
      df['air_end_date'] = df['air_dates'].str.split(" - ", expand=True)[1]
      
      df['air_start_date'] = pd.to_datetime(df['air_start_date'], errors="coerce")
      df['air_end_date'] = pd.to_datetime(df['air_end_date'], errors="coerce")
      
      df['timediff_days'] = (df['air_end_date']-df['air_start_date']).dt.days
      

      这将为您提供虚拟示例

      df['timediff_days']
      0    456.0
      1      NaN
      Name: timediff_days, dtype: float64
      

      关于月差的计算,你可以找到一些如何计算那些here的建议。我会选择@piRSquared's approach

      df['timediff_months'] = ((df['air_end_date'].dt.year - df['air_start_date'].dt.year) * 12 +
                               (df['air_end_date'].dt.month - df['air_start_date'].dt.month))
      
      df['timediff_months']
      0    15.0
      1     NaN
      Name: timediff_months, dtype: float64
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 2017-09-24
        • 2014-08-10
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多