在python中检查是否是月底

jen*_*ryb 2 python datetime pandas

我正在编写代码来获取去年的数据。我想像这样对较早的日期进行四舍五入:如果是 2015 年 7 月 14 日,我想要 2014 年 8 月 1 日至 2015 年 7 月 14 日的数据

df = pd.read_csv('MyData.csv') 
df['recvd_dttm'] = pd.to_datetime(df['recvd_dttm'])
range_max = datetime.datetime.now() 
range_min = range_max - pd.tseries.offsets.DateOffset(years=1)+ pd.tseries.offsets.MonthEnd(1) + pd.tseries.offsets.DateOffset(days=1)
if datetime.datetime.now() == is_month_end:

# take slice with final week of data
df = df[(df['recvd_dttm'] >= range_min) & 
               (df['recvd_dttm'] <= range_max)]
Run Code Online (Sandbox Code Playgroud)

我的问题是,当它是2015年7月31日,我的代码转到结束未来一个月,基本上切割出一整月。

我正在尝试创建一个 for 循环来解决这个问题。

如果是月底:

range_min = range_max - pd.tseries.offsets.DateOffset(years=1)
Run Code Online (Sandbox Code Playgroud)

别的:

range_min = range_max - pd.tseries.offsets.DateOffset(years=1)+ pd.tseries.offsets.MonthEnd(1) + pd.tseries.offsets.DateOffset(days=1)
Run Code Online (Sandbox Code Playgroud)

我如何告诉python检查月底?MonthEnd 只是一个偏移函数。

Chr*_*ing 18

我们可以避免导入calendar仅利用datetime.

如果明天的月份与今天的月份不同,则意味着今天是当月的最后一天。我们可以使用一个简短的函数以编程方式检查这一点,例如

import datetime 
def end_of_month(dt):
    todays_month = dt.month
    tomorrows_month = (dt + datetime.timedelta(days=1)).month
    return tomorrows_month != todays_month
Run Code Online (Sandbox Code Playgroud)

现在,针对您的具体用例:

now = datetime.datetime.now()
if end_of_month(now):
    range_min = range_max - pd.tseries.offsets.DateOffset(years=1)
else: 
    range_min = range_max - pd.tseries.offsets.DateOffset(years=1) +pd.tseries.offsets.MonthEnd(1) + pd.tseries.offsets.DateOffset(days=1)
Run Code Online (Sandbox Code Playgroud)


Mar*_*are 8

我只是使用日历模块的 monthrange 方法来查找该月的最后一天:

    def check_if_last_day_of_week(date):
        import datetime
        import calendar
        #  calendar.monthrange return a tuple (weekday of first day of the 
        #  month, number  
        #  of days in month)
        last_day_of_month = calendar.monthrange(date.year, date.month)[1]
        # here i check if date is last day of month
        if date == datetime.date(date.year, date.month, last_day_of_month):
            return True
        return False


>>> date = datetime.date(2018, 12, 31)
>>> check_if_last_day_of_week(date)
True
Run Code Online (Sandbox Code Playgroud)


jen*_*ryb 0

好吧,这就是我所做的。找到 BryanOakley 建议的日历模块并制作了这个循环。它检查当前日期并检查它是否与该月的最后一天相同,并相应地选择 range_min。

if datetime.datetime.now().day == calendar.monthrange(date.year, date.month)[1]:
    range_min = range_max - pd.tseries.offsets.DateOffset(years=1)+ pd.tseries.offsets.DateOffset(days=1)
else:
    range_min = range_max - pd.tseries.offsets.DateOffset(years=1)+ pd.tseries.offsets.MonthEnd(1) + pd.tseries.offsets.DateOffset(days=1)
Run Code Online (Sandbox Code Playgroud)