30

パンダの日時の日付を月末に変換する関数を作成しました。

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

この関数はかなり遅いようですが、もっと速い代替手段があるかどうか疑問に思っていましたか? 遅いことに気付いた理由は、これを 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)

それが関連しているかどうかはわかりませんが、次のように日付を読んでいます。

def read_as_date(x):
    return datetime.datetime.strptime(x, fmt)
4

6 に答える 6

3
import pandas as pd
import numpy as np
import datetime as dt    

df0['Calendar day'] = pd.to_datetime(df0['Calendar day'], format='%m/%d/%Y')
df0['Calendar day'] = df0['Calendar day'].apply(pd.datetools.normalize_date)    
df0['Month Start Date'] = df0['Calendar day'].dt.to_period('M').apply(lambda r: r.start_time)

このコードは機能するはずです。Calendar Day は、日付が %m/%d/%Y の形式で指定される列です。例: 12/28/2014 は 2014 年 12 月 28 日です。出力は、クラス 'pandas.tslib.Timestamp' タイプで 2014-12-01 になります。

于 2016-12-05T14:37:21.607 に答える