データフレームp_mdがあります。インデックスはDateTimeです。インデックスがその日の午後5時より前の場合、列の値がその日の午後11時である、Finishという新しい列を作成したいと思います。それ以外の場合、午後5時以降の場合、[完了]列の値は翌日の午後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)
これを行うと、日時コンストラクターが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]が原因で、データフレームの値の最初の行のみが使用されます。
テーブル作成コードのリクエスト:csvファイルからDateTimeを読み取っただけですが、基本的に最初のテーブルは次のようになります。
df = pd.DataFrame()
df['DateTime'] = pd.date_range("1/1/2017", periods=500, freq="H")
df.set_index("DateTime", inplace=True)
df["Test"] = 0
私があなたを正しく理解しているなら、私は「仕上げ」を次のように作成します:
p_md["Finish"] = p_md.index
次に、シリーズ適用(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html)関数を使用して、目的の出力を取得します。
p_md["Finish"] = p_md["Finish"].apply(lambda dt: pd.Timestamp(dt.year, dt.month, dt.day, 23, 0 ,0) + pd.Timedelta(days=1)
if dt.hour > 17 else pd.Timestamp(dt.year, dt.month, dt.day, 23, 0 ,0))
または、別の関数を作成して、それを適用に割り当てることができます。
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-03-04 03: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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加