【问题标题】:For a list of dates, check if it is between another list of 2 dates对于日期列表,检查它是否在另一个 2 个日期列表之间
【发布时间】:2020-12-18 09:26:28
【问题描述】:

我正在尝试比较 2 个日期列表,方法是检查第一个数据框中的“timekey”列是否在 2 个日期之间,其中 2 个日期是时间表和时间表中的日期 - 1 年。

例如,检查 30Aug2020 是否介于 30Nov2020 和 30Nov2020-1year 之间,即 30Nov2019。 然后我想在原始 df 中有一个第三列,它显示时间键日期和比较时间列表日期之间的差异。

我正在使用 pandas 在 python 中完成所有这些工作。

import pandas as pd
import datetime as dt

datelist = pd.date_range(start = dt.datetime(2016,8,31), end = dt.datetime(2020,11,30), freq = '3M')
data = {'ID': ['1', '2', '3'], 'timekey': ['31Dec2016', '30Jun2017', '30Aug2018']}
df = pd.DataFrame(data)
df['timekey'] = pd.to_datetime(df['timekey'])

print(df)
print(datelist)

这是我尝试过的代码,但我有一个值错误,他们说长度必须匹配才能进行比较。怎么回事?

for date in datelist:
    if (df['timekey'] <= datelist) & (df['timekey'] >= (datelist - pd.offsets.DateOffset(years=1))):
        df['diff'] = df['timekey'] - (datelist - pd.offsets.DateOffset(years=1))

预期的输出应该是对于每个 timekey,如果它在 datelist 指定的日期范围内,它应该生成一个具有相同 ID 和 timekey 的全新行,第三个新列是月份的差异。

例如,如果时间键是 30Jun2020,则它会在 30Nov2019-30Nov2020、30Aug2019-30Aug2020 之间。将创建 2 行,其中以月为单位的时差分别为 5 和 2。

【问题讨论】:

  • 请发布您的预期输出
  • "for date in datelist" 将遍历 datelist 中的 18 个日期。 “df”只有 3 行,所以听起来/看起来您正在尝试将 18 行的列添加到只有 3 行的 df。

标签: python pandas datetime


【解决方案1】:

我能想到的解决您的问题的最简单方法是使用 unix 时间戳(它将返回自 1970-01-01 以来经过的秒数)进行比较。因此,您需要将日期转换为 unix。 像这样的东西会起作用:

unixTime = (pd.to_datetime(<yourTime>) - pd.Timestamp('1970-01-01T00:00:00.000Z')) // pd.Timedelta('1s')

因此,检查日期是否介于两个日期之间的工作示例可能如下所示:

def checkIfInbetween(date1,date2,dateToCheck):
   date1 = (pd.to_datetime(date1) - pd.Timestamp('1970-01-01T00:00:00.000Z')) //   pd.Timedelta('1s')
   date2 = (pd.to_datetime(date1) - pd.Timestamp('1970-01-01T00:00:00.000Z')) // pd.Timedelta('1s')
   dateToCheck = (pd.to_datetime(dateToCheck) - pd.Timestamp('1970-01-01T00:00:00.000Z')) // pd.Timedelta('1s')
      if(dateToCheck<date2 && dateToCheck>date1):
         return True
      else:
         return False

df['isInbetween'] = df.apply(lamdbda x: checkIfInbetween(x['date1'], x['date2'], x['dateToCheck']))

(代码未测试)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2019-11-21
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多