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

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

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

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

Q&A

解決済

2回答

3718閲覧

日付をキーにして、DataFrameデータをマージしたい

kazushige

総合スコア20

Python 3.x

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

0グッド

0クリップ

投稿2019/08/05 16:32

日付をキーにして、DataFrameデータをマージしたいのですが、日付のファーマットが、
②と③の時はうまくいくが、①と②のマージはうまくいかない。
①20190802 ②2019-08-02 ③2019/8/2

プロクラム例(説明のために作成したプログラム)
python3.5で、Jupyter Notebockを使ってプログラム。

import pandas as pd
import datetime

############### 指定列データ「日付」をキーにしてマージ ##################
kabuka = pd.read_csv('1329.csv',usecols=['日付','終値'],encoding="shift-jis")
kabuka.rename(columns={'終値':'1329'}, inplace=True)
print('kabuka =\n',kabuka[:2])

n225x = pd.read_csv('n225x.csv',usecols=['日付','終値'],encoding="shift-jis")
kabuka.rename(columns={'終値':'n225'}, inplace=True)
print('n225x =\n',n225x[:2])

kabukas['日付'] = pd.to_datetime(kabukas['日付'])
print('kabukas[日付] =\n',kabukas[:2])
n225x['日付'] = pd.to_datetime( n225x['日付'])
print('n225x[日付] =\n',n225x[:2])
ETFTable_X = pd.merge( kabukas, n225x,how='inner', on='日付')
print('ETFTable_X =\n',ETFTable_X[:2])
次にこれを実行した結果示す。
日付データが異なるため、一致するキーデータがなく、Emptyになっている。
日付データが20190802ではなく、2019-08-02の時データのものは、うまくいく。
(以前、この場で教えていただいたときはそのようなケースでした)
また、ご教授方よろしくお願いします。

kabuka =
日付 1329
0 20190802 21850
1 20190801 22300
n225x =
日付 終値
0 2015/1/2 17432
1 2015/1/5 17097
kabukas[日付] =
日付 1329 1364
0 1970-01-01 00:00:00.020190802 -450 -550
1 1970-01-01 00:00:00.020190731 -190 210
n225x[日付] =
日付 終値
0 2015-01-02 17432
1 2015-01-05 17097
ETFTable_X =
Empty DataFrame
Columns: [日付, 1329, 1364, 終値]
Index: []

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

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

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

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

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

guest

回答2

0

参考までですが下記を使うと比較的楽に日付変換ができます。

pip install python-dateutil
https://pypi.org/project/python-dateutil/

# -*- coding: utf-8 -*- from dateutil.parser import parse str1 = '20190801' str2 = '2019-08-01' str3 = '2019/08/01' print(parse(str1).date()) print(parse(str2).date()) print(parse(str3).date()) 2019-08-01 2019-08-01 2019-08-01

日付型を文字列に戻したい場合は

output = str(parse(str1).date())

すればOKです。

投稿2019/08/05 23:20

shotanuki

総合スコア102

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

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

kazushige

2019/08/06 05:57

早速、対応していただきありがとうございます。日付データはDataFrameのデータですので、ご指摘していただいた方法を適用すると、「 Parser must be a string or character stream, not Timestamp」のエラーが出てしまいます。
guest

0

ベストアンサー

①も 「pd.to_datetime」の変換で出来ませんか?

【追記】書式指定が必要かもしれません。
pd.to_datetime(df['XX'],'%Y%m%d')

pd.to_datetime(df['XX'].astype(str))

投稿2019/08/05 22:24

編集2019/08/06 06:56
meg_

総合スコア10577

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

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

kazushige

2019/08/06 04:44

早速、ご教授くださりありがとうございます。修正して、実行してみましたが、修正箇所でAssertionError:のエラーになってしまいました。 以前に確かめたのですが、 kabuka['日付'] = pd.to_datetime(kabuka['日付'],format='%Y/%m/%d') とすると、エラーにはならないのですが、やはりEmptyになってしまいます。
meg_

2019/08/06 06:09

確認ですが、日付の列には「20190802」などの8桁の数字だけがあるのですよね?
meg_

2019/08/06 06:41

すみません。回答を修正しました。
kazushige

2019/08/09 10:52

修正したご指摘で、うまく解決いたしました。今後共によろしくご指導方よろしくお願いいたします。修正のご指摘があった翌日に試して解決したのですが、お知らせする方法がわからなくて、遅くなってしまいました。失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問