質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

627閲覧

月日のみの日付データに、直近数ヶ月の日付データをもとに年情報を追加したい

scrw

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/09/27 07:36

前提・実現したいこと

"9/20"のような月日のみのデータに、直近数ヶ月の日付をもとに年を追加したいです。

発生している問題・エラーメッセージ

print(df) 0 1900-09-24 1 1900-09-22 2 1900-09-21 3 1900-09-17 4 1900-09-16 ...

日経新聞のウェブサイトから株価の情報を取得するプログラムを書いています。
データを取得して、日付の部分から曜日を削除しました。
日付に年情報が含まれていないため正しい年情報を追記したいのですが、何をしたら良いのかわかりません。

該当のソースコード

python

1url = 'https://www.nikkei.com/nkd/company/history/dprice/?scode=1301&ba=1' 2 3data = pd.read_html(url) 4df = data[0] 5dff = df.set_axis(['date', 'open', 'high', 'low', 'close', 'volume', 'adj_close'], axis=1) 6dff['date'] = dff['date'].str.replace("([^\x01-\x7E])", '', regex=True) 7dff['date'] = pd.to_datetime(dff['date'], format='%m/%d') 8 9print(dff['date']) 10 110 1900-09-24 121 1900-09-22 132 1900-09-21 143 1900-09-17 154 1900-09-16 16...

試したこと

部分一致や後方一致で置換すれば良いかなと思い、とりあえず直近三ヶ月の日付データをリストに入れてみましたがこの先どうすれば良いのかわかりません。
そもそもこの方法で実現できるのか、他にもっと良い方法があるのではないかとも感じています。

python

1today = datetime.date.today() 2days = [today - datetime.timedelta(days=s) for s in range(90)]

いろいろ調べてはみましたが、いまいちよくわからないので質問させていただきました。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

python
jupyter notebook
docker

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ppaul

2021/09/27 08:12

https://www.nikkei.com/lounge/help/tos.html の 第12条 日経の知的財産権等 の 利用者は、日経、提携先または広告主から事前の文書による承諾を受けた場合を除いては、本サービスもしくはソフトウェアまたはそれらに包含される内容(全部または一部を問わず)を複製、公開、送信、頒布、譲渡、貸与、翻訳、翻案、使用許諾、転載または再利用しないことを了承するものとします。 の 複製にあたるように思います。 やるならば、日経、提携先または広告主から事前の文書による承諾を受けてください。
guest

回答1

0

ベストアンサー

年が入ればよいのですね?
最新のデータの年は、プログラム実行時の年と同一であるという前提で書いてみました。
元旦またぎは月で判定するようにしています。

こういった感じでどうでしょうか。

importの追加

python3

1from datetime import date

printの前に以下の行の追加

python3

1yr = date.today().year 2dff['date',0] = date(yr, dff['date'][0].month, dff['date'][0].day) 3for num in range(1, len(dff['date'])): 4 if(dff['date'][num].month == 12 and dff['date'][num-1].month == 1): 5 yr = yr -1 6 7 dff['date',num] = date(yr, dff['date'][num].month, dff['date'][num].day) 8

ご指摘の知的財産関連の問題はクリアされているという前提で回答しています(^^

投稿2021/09/27 09:51

tyamzak_

総合スコア95

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scrw

2021/09/27 11:21

ご返信ありがとうございます。 試してみたところ、dff['date',0]の形では'date, 0'や'date, 1'というカラムに代入されてしまいます。 dff['date'][0]とすれば望み通りの形で出力されますが、連鎖インデックスになってしまうのでできれば避けたいです
scrw

2021/09/27 11:27

自己解決しました! 行と列の順番が逆になっていました。
tyamzak_

2021/09/27 11:36

そうでしたか。 よかったです。 .locを使って書き直したところでした。 yr = date.today().year dff.loc[:,('date',0)] = date(yr, dff['date'][0].month, dff['date'][0].day) for num in range(1, len(dff['date'])): if(dff['date'][num].month == 12 and dff['date'][num-1].month == 1): year -= 1 dff.loc[:,('date',num)] = date(yr, dff['date'][num].month, dff['date'][num].day)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問