pandas:将datetime转换为月末

Ann*_*nne 21 python pandas

我编写了一个将pandas datetime日期转换为month-end的函数:

import pandas
import numpy
import datetime
from pandas.tseries.offsets import Day, MonthEnd

def get_month_end(d):
    month_end = d - Day() + MonthEnd() 
    if month_end.month == d.month:
        return month_end # 31/March + MonthEnd() returns 30/April
    else:
        print "Something went wrong while converting dates to EOM: " + d + " was converted to " + month_end
        raise
Run Code Online (Sandbox Code Playgroud)

这个功能似乎很慢,我想知道是否有更快的替代方案?我注意到它很慢的原因是我在一个具有50'000个日期的数据帧列上运行它,并且我可以看到自引入该函数以来代码慢得多(在我将日期转换为月末之前).

df = pandas.read_csv(inpath, na_values = nas, converters = {open_date: read_as_date})
df[open_date] = df[open_date].apply(get_month_end)
Run Code Online (Sandbox Code Playgroud)

我不确定这是否相关,但我正在阅读如下日期:

def read_as_date(x):
    return datetime.datetime.strptime(x, fmt)
Run Code Online (Sandbox Code Playgroud)

Jef*_*eff 31

修改后,转换为句点然后再回到时间戳就可以了

In [104]: df = DataFrame(dict(date = [Timestamp('20130101'),Timestamp('20130131'),Timestamp('20130331'),Timestamp('20130330')],value=randn(4))).set_index('date')

In [105]: df
Out[105]: 
               value
date                
2013-01-01 -0.346980
2013-01-31  1.954909
2013-03-31 -0.505037
2013-03-30  2.545073

In [106]: df.index = df.index.to_period('M').to_timestamp('M')

In [107]: df
Out[107]: 
               value
2013-01-31 -0.346980
2013-01-31  1.954909
2013-03-31 -0.505037
2013-03-31  2.545073
Run Code Online (Sandbox Code Playgroud)

请注意,这种类型的转换也可以像这样完成,但上面会稍快一些.

In [85]: df.index + pd.offsets.MonthEnd(0) 
Out[85]: DatetimeIndex(['2013-01-31', '2013-01-31', '2013-03-31', '2013-03-31'], dtype='datetime64[ns]', name=u'date', freq=None, tz=None)
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于每月有 1 个条目的情况吗?我不认为 Anne 的所有 50000 个条目都是独特的月份。:) (2认同)

Dim*_*jan 8

如果日期列采用日期时间格式并设置为该月的开始日期,则会为其添加一个月的时间:

df['date1']=df['date'] + pd.offsets.MonthEnd(0) 
Run Code Online (Sandbox Code Playgroud)