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

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

新規登録して質問してみよう
ただいま回答率
85.49%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

3回答

3116閲覧

Python 日付データの変換方法について

qsuke

総合スコア11

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

0クリップ

投稿2019/08/31 17:46

編集2019/09/01 02:15

前提・実現したいこと

object型となっているデータから、datetime64型の日付データに変換したい。

困っていること、及び該当のソースコード

Python

1# 2つのCSVデータ中身(例) 2日時,株価,始値,高値,安値,出来高,時価総額(百万円) 32019/8/29 15:00,1383,1320,1399,1317,411900,22274 4 5日時,株価,始値,高値,安値,出来高,時価総額(百万円) 62019/8/30 15:00,1361,1353,1368,1337,269100,21919 7 8# 必要なライブラリをimport 9import json,csv 10import pandas as pd 11import numpy as np 12import glob 13 14# 2つのCSVを結合 15csv_files = glob.glob('*.csv') 16list = [] 17 18for f in csv_files: 19 list.append(pd.read_csv(f, encoding='cp932')) 20df = pd.concat(list) 21 22dfs = df.rename(columns={'日時': 'date', '株価': 'close', '始値': 'open', '高値': 'high', '安値': 'low', '出来高': 'volume', '時価総額(百万円)': 'Market-cap'})

このような形で作ったデータの型を見ると、以下のように表示されました。object型ではあるものの、要素は文字列str型ではない、とのこと。

Python

1print(dfs['date'].dtypes) 2# object 3 4print(type(dfs['date'][0])) 5# <class 'pandas.core.series.Series'>

なので、以下のようにすると、以下のようなエラーメッセージが出てしまい、変換できませんでした。

Python

1pd.to_datetime(df['date']) 2 3# ValueError: String does not contain a date.

ただし、確認したところ、1つのCSVデータ単体の'date'の型を見ると、以下のように変換する必要のない、求める型で存在していることが分かりました。

Python

1# datetime64[ns] 2# <class 'pandas._libs.tslib.Timestamp'>

したがって、CSVを結合したことによって型が変わってしまったと考えられるのですが、このようなケースで、'date'の型を上記のように求める型に戻す、もしくは求める型のまま結合するにはどのようにしたらいいでしょうか。また、さらに、最終形態としては「2019/8/30 15:00」ではなく「2019/8/30」と時間を削除した形で表示できるようにしたいです。

以上、解決方法など、アドバイスいただけると助かります。よろしくお願いします。

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

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

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

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

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

can110

2019/09/01 00:39

dfの中身がよく分からないので、データ作成(あるいは読込)処理部分のコードも提示すると回答得られやすくなります。
qsuke

2019/09/01 01:09

コメントありがとうございます。 元データは、あるサイトからダウンロードしたCSVをそのまま読み込んだものなのでよく分からないのですが、どのように表現するのが良いでしょうか…(初心者で、質問の仕方や勝手が分かっておらず、すみません…)
can110

2019/09/01 01:15

まず元CSVが数千行または列ある場合は、現象が再現する最小限までテキストエディタで中身を削ってください。 次に元CSVの中身(テキスト)をコピーし<code>ブロックで囲んだ中にそのまま貼り付けてください。 そうすると比較的中身が維持されたままアップロードできます。 さらにデータ読込部分(read_csv)も含めてコードを再提示ください。read_csvにどのようなオプションをつけて呼び出しているかも動作に影響があるので。
meg_

2019/09/01 01:52

CSVから読み込んだ処理(コード)を教えてください。掲載の日付文字列であれば問題なく日付形式へ変換できるはずですが。
qsuke

2019/09/01 02:03

ご指摘、アドバイス、ありがとうございます! 1つ、問題の要因が明確になったように思います。 ご指摘、アドバイスいただいたように、上記、私の手元の状況に近い内容に編集したのですが、その過程で、CSVを結合したことによって起こっている現象ではないかと思いました。ただ、要因が判明したところで、現状の私のレベルではそれを解決する術も思い浮かばず、質問させていただいているステータスのままにしております。 もしよろしければ、解決につながるご意見をいただけますと幸いです。よろしくお願いします。
can110

2019/09/01 02:12

提示されたCSVデータの項目の区切り文字はタブのように見えますが、実際にはカンマではないでしょうか?(もしかしてExcelで開いて貼り付けてないでしょうか?) 提示ソースのread_csvはカンマ区切として想定したコードになっているので、確認です。
qsuke

2019/09/01 02:17

Excelで開いて貼り付けていました… テキストエディタで開いたものは、ご指摘のとおり、カンマ区切りのあるものでしたので、それをコピーしたもの(カンマあり)に差し替えました。 何度も間違いを正すご指摘いただき、ありがとうございます。
guest

回答3

0

元のデータがないので確かなことは分かりませんが、Pandas.to_datetime()で下記エラーが出るということは「df['date']」の中に日付に変換できないデータがあるのかと思われます。

Python

1pd.to_datetime(df['date']) 2 3# ValueError: String does not contain a date.

エクセルで開ける程度のファイルサイズであれば、データの中身を調べてみてはどうでしょうか?

投稿2019/09/01 03:25

meg_

総合スコア10579

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

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

0

ベストアンサー

やや提示コードが複雑だったので単純化しました。以下のコードのようにすると文字→日時型に変換できます。

最終形態としては「2019/8/30 15:00」ではなく「2019/8/30」と時間を削除した形で表示できるようにしたいです。

表示というか日付型はdf['~'].dt.dateで取り出せます。
参考:Keep only date part when using pandas.to_datetime

Python

1import pandas as pd 2from io import StringIO 3 4df = pd.DataFrame() # 空のDataFrame 5for s in ['日時,株価\n2019/8/29 15:00,1383', '日時,株価\n2019/8/30 15:00,1361']: 6 l = [df, pd.read_csv(StringIO(s))] 7 df = pd.concat(l) # 末尾に追加 8 9# 整形 10df.reset_index(drop=True, inplace=True) 11df.rename(columns={'日時': 'date', '株価': 'close'}, inplace=True) 12df['date'] = pd.to_datetime(df['date']) # 日時型に 13print(df) 14# date close 15#0 2019-08-29 15:00:00 1383 16#1 2019-08-30 15:00:00 1361 17 18# 日時→日付型に 19df['date'] = df['date'].dt.date 20print(df) 21# date close 22#0 2019-08-29 1383 23#1 2019-08-30 1361

投稿2019/09/01 02:34

can110

総合スコア38254

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

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

qsuke

2019/09/01 03:16

ご丁寧にありがとうございます! いただいたものを自分の環境でやってみたら、私の方でも実現できました。 ただ、この場合、もう1点問題が出てきました。 今回のケースの場合、元データをシンプルにした形だったので問題ありませんでしたが、本来のものは不要な列が多く、df.renameの前にdf.dropで不要な列を削除していました。そのため、いただいたものを反映すると、reset_indexの影響で「削除する列が含まれていない」とエラーが出てしまいます。 たとえば、上記のケースで考えた場合、'日時(date)'だけを残して'株価(close)'の列を削除するにはどのようにしたらいいでしょうか。お手数おかけしますが、再度アドバイいただけますと幸いです。
can110

2019/09/01 03:30

「df = df['date'].to_frame()」のように「date」列だけ抜き出せばよいです。
qsuke

2019/09/01 05:02

ありがとうございます! 無事処理することができました。
guest

0

その型が何か、をまずはっきりさせましょう
str型じゃなければなんでしょうか。
たとえば、そいつの日付を表示するときはどうするんでしょうか?

投稿2019/08/31 23:09

y_waiwai

総合スコア87747

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

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

qsuke

2019/09/01 01:11

ご指摘ありがとうございます。 上記にも記載しておりますが、# <class 'pandas.core.series.Series'>型であることは分かっているものの、それを # datetime64[ns] # <class 'pandas._libs.tslib.Timestamp'> に変更したい、というのが私の質問の意図でして、それを伺いたく、ご質問しました。初心者のため、質問の仕方や勝手が分かっておらず、うまく表現できていないようですみません…
y_waiwai

2019/09/01 01:18

繰り返しになりますが、そいつの日付を表示するときはどうするんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問