python 向Pandas df添加列,检查日期范围是否福尔斯在任何年份的给定月份

qmelpv7a  于 2023-03-21  发布在  Python
关注(0)|答案(2)|浏览(99)

我们有一个条目的数据框架,我们想知道在任何一年的给定月份内哪些条目曾经存在过。简化的例如:

import pandas as pd
import datetime as dt

df = pd.DataFrame(
    {
         "start": [dt.datetime(2020,1,1), dt.datetime(2020,8,1), dt.datetime(2020,8,1)],
         "finish": [dt.datetime(2021,12,1), dt.datetime(2021,6,1), dt.datetime(2022,6,1)],
     })

我们如何添加一个列来确定哪些条目在任何一年的任何一个7月都存在呢?如果我们只关心2020年7月,我们可以添加这个列:df['existed_in_july_2020'] = (df['start'] < dt.datetime(2020,7,1)) & (df['finish'] >= dt.datetime(2020,8,1)),但这个没有其他年份,第三个条目存在于2021年7月。
在这个例子df中,列existed_in_july将是:

df = pd.DataFrame(
    {
         "start": [dt.datetime(2020,1,1), dt.datetime(2020,8,1), dt.datetime(2020,8,1)],
         "finish": [dt.datetime(2021,12,1), dt.datetime(2021,6,1), dt.datetime(2022,6,1)],
         "existed_in_july": [True, False, True]
     })

如何创建此列?

lkaoscv7

lkaoscv71#

一个可行的选择是检查开始或结束年份的7月是否在这两个日期之间,或者两者之间是否超过一年:

m1 = df['start'].add(pd.DateOffset(month=7)).between(df['start'], df['finish'])

m2 = df['finish'].add(pd.DateOffset(month=7)).between(df['start'], df['finish'])

m3 = df['finish'].sub(df['start']).gt('1Y')

df['existed_in_july'] = m1|m2|m3

输出:

start     finish  existed_in_july
0 2020-01-01 2021-12-01             True
1 2020-08-01 2021-06-01            False
2 2020-08-01 2022-06-01             True
lrl1mhuk

lrl1mhuk2#

您可以在列表解析中使用月份期间和测试July月份:

df['existed_in_july'] = [(pd.period_range(a, b, freq='m').month == 7).any()  
                         for a, b in zip(df['start'], df['finish'])]
print (df)
 
        start     finish  existed_in_july
0 2020-01-01 2021-12-01             True
1 2020-08-01 2021-06-01            False
2 2020-08-01 2022-06-01             True

相关问题