2017-08-20 19 views
0

私はデータフレームp_mdを持っています。インデックスはDateTimeです。私はFinishという新しい列を作成したい。インデックスがその日の午後5時より前であれば、その列の値はその日の午後11時である。それ以外の場合は、5PM後に、Finishカラムの値はNEXT日の午後11時です。私がこれまで持って何パンダのデータフレームにシリーズを追加する

:私はこれを行うと

p_md["Finish"] = pd.Timestamp(datetime(p_md.index.year, p_md.index.month, p_md.index.day, 23, 0, 0)) 

p_md.loc[(p_md.index.hour > 17), "Finish"] = p_md.Finish + pd.Timedelta(days=1) 

私はdatetime型のコンストラクタがintの代わりにint64Indexを取得していることを示す例外TypeErrorを取得します。私はしかし、それだけで、データフレームの値の最初の行を使用して、

p_md["Finish"] = pd.Timestamp(datetime(p_md.index.year[0], p_md.index.month[0], p_md.index.day[0], 23, 0, 0)) 

これはコンパイルされ、実行に行を変更おそらく[0]。

表の作成コード要求:私が正しくあなたを理解していれば、私は「フィニッシュ作成し

df = pd.DataFrame() 

df['DateTime'] = pd.date_range("1/1/2017", periods=500, freq="H") 
df.set_index("DateTime", inplace=True) 
df["Test"] = 0 
+0

サンプルデータフレームを生成するコードを提供できますか? –

+0

@DancePartyあなたの要求に応じてテーブル作成コードを追加しました – sid

答えて

0

: 私はちょうどここにCSVファイルから日時を読んで、しかし、基本的に、最初の表は次のようになります"として:

:次に

p_md["Finish"] = p_md.index 

、私は、所望の出力を得るためにシリーズ(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html)関数を適用する使用します210

それとも、別の関数を作成し、適用にそれを割り当てることができます。

def cvt_date(dt): 
    new_dt = pd.Timestamp(dt.year, dt.month, dt.day, 23, 0 ,0) 
    if dt.hour > 17: new_dt = new_dt + pd.Timedelta(days=1) 
    return new_dt 

p_md['Finish'] = p_md['Finish'].apply(cvt_date) 

ここで私が取得元のデータと出力です:

2016年3月4日午前3時48分41秒 - 2016 -03-04 23:00:00
2016-02-05 22:08:25 - 2016-02-06 23:00:00
2016-12-11 19:13:54 - 2016-12-12 23:00:00

+0

、ありがとう!ラムダdtの部分をもう少し説明できますか?私はPythonには新しく、ラムダ構文はまだ私に混乱しています。私はpythonがdtがdatetimeオブジェクトを参照していることを[Finish]で知っているかどうか、そしてdatetimeオブジェクトとして扱う方法を理解していません – sid

+0

Lambdaは関数を定義する一つの方法です。ラムダに関する良い議論がここにあります:https://stackoverflow.com/questions/890128/why-are-python-lambdas-useful Pythonはdatetimeオブジェクトであることを知っています。なぜなら私はdatetimeで.apply関数を使用しているからですシリーズ "Finish"。基本的に、Applyはシリーズ全体を反復し、各反復値をdtとして定義しました。同様の結果が得られるはずです: p_mod ['finish']の値の[cvt_date(value)] – Vico

関連する問題