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

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

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

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

Q&A

解決済

2回答

3548閲覧

日付の形式を変更したい

AMK

総合スコア765

Python 3.x

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

0グッド

0クリップ

投稿2020/01/20 17:08

編集2020/01/20 17:28

やりたい事

下記サイトを参考にAPIで取得したデータの日付を
2020-01-15T01:55:00.000000000Z,
から
2020.01.15,01:55,
に変更したい

https://mathokapro.com/2019/07/25/oandav20_get_data/

現在の状況

python3

1data = [] 2#少し形を成形してあげる 3for raw in res1: 4 data.append([raw['time'], raw['mid']['o'], raw['mid']['h'], raw['mid']['l'], raw['mid']['c'], raw['volume']]) 5 6#DataFrameに変換して、CSVファイルに保存をする。 7df = pd.DataFrame(data) 8df.columns = ['date', 'open', 'high', 'low', 'close', 'volume'] 9 10#日付型の表示形式を変更する 11for i in df['date']: 12# i = pd.Timestamp(i).tz_convert('Asia/Tokyo') 13 i = "{0:%Y.%m.%d,%H:%M:%S}".format(i) 14 15#df = df.set_index('date') 16#df.index = df.index.astype('datetime64') 17df.to_csv(ex_pair[:3]+ex_pair[4:]+'_'+asi+'.csv', encoding='UTF8', header=False, index=False) 18

データを取得後forで変換していけば行けるのでは?と思い
タイムスタンプを変更するfor分を改造してみましたが下記のようなエラーになりました。

error

1Traceback (most recent call last): 2 File "hist.py", line 74, in <module> 3 i = "{0:%Y.%m.%d,%H:%M:%S}".format(i) 4ValueError: Invalid format specifier

エラーを翻訳してみると「無効な形式指定子」と出たので
i = "{0:%Y.%m.%d,%H:%M:%S}".format(i)の使い方が間違っている
と言う事はでは解るのですが、次はどうすればいいか分かりません。

もしかしたらもっと上の方のコードで変換した方が良いのでしょうか?

進展

Python

1#少し形を成形してあげる 2for raw in res1: 3 data.append([datetime.fromisoformat(raw['time'][:19]), raw['mid']['o'], raw['mid']['h'], raw['mid']['l'], raw['mid']['c'], raw['volume']])

appendの所でフォーマットを指定してあげたら近い形になりました・・・

2020-01-15 01:55:00
2020.01.15,01:55,

後は、秒数を消すのと-を.に日付と時間の間に,を入れたいです。

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

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

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

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

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

guest

回答2

0

単純な文字列変換ならこれでいけるので、あとは pandas に合わせれば・・・
タグに pandas を指定した方がいいように思います。

python

1import datetime 2 3s = '2020-01-15T01:55:00.000000Z' 4t = datetime.datetime.fromisoformat(s.replace('Z', '+09:00')) 5f = f'{t:%Y.%m.%d,%H:%M}' 6print(f)

投稿2020/01/21 00:33

shiracamus

総合スコア5406

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

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

0

ベストアンサー

現在 'date'列は文字列型ですかね?
でしたら、まずDataFrameに変換した後にでも'date'列を pandas.to_datetime() にて datetime型に変換してください。(deteの文字列は前もって整形せずにそのまま入力してください )
その上で CSVに書き出す段階で
df.to_csv(date_format='%Y.%m.%d,%H:%M')
のようにして、フォーマットを指定すると良いかと思います。

Python

1import pandas as pd 2 3data = [['2020-01-15T01:55:00.000000000Z', 0,0,0,0,0]] 4 5# DataFrameに変換して、CSVファイルに保存をする。 6df = pd.DataFrame(data) 7df.columns = ['date', 'open', 'high', 'low', 'close', 'volume'] 8 9#日付型の表示形式を変更する 10df['date'] = pd.to_datetime(df['date']) 11 12df.to_csv('out.csv', encoding='UTF8', header=False, index=False, date_format='%Y.%m.%d,%H:%M')

【コメントを受けて追記】

Python

1import pandas as pd 2 3data = [['2020-01-15T01:55:00.000000000Z', 0,0,0,0,0]] 4 5# DataFrameに変換して、CSVファイルに保存をする。 6df = pd.DataFrame(data) 7df.columns = ['datetime', 'open', 'high', 'low', 'close', 'volume'] #日付型の表示形式を変更する 8df['datetime'] = pd.to_datetime(df['datetime']) 9 10df['time'] = df['datetime'].dt.strftime('%H:%M') 11df['date'] = df['datetime'].dt.strftime('%Y.%m.%d') 12df[['date','time', 'open', 'high', 'low', 'close', 'volume']].to_csv('out.csv', encoding='UTF8', header=False, index=False)

投稿2020/01/21 00:11

編集2020/01/21 16:21
magichan

総合スコア15898

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

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

AMK

2020/01/21 03:39

思い通りの状態になりました! ありがとうございます。!!
AMK

2020/01/21 06:50

すみません "2020.01.02,19:12", になるので ”が無いバージョンってどうすればよいですか???
magichan

2020/01/21 07:57

" をなくすると 時間の文字列の中に含まれている ',' と区切り文字の ',' の見分けができなくなりますので CSV的にはNGになります。 それとも、日付と時刻の間に区切り文字の ',' を入れて日付と時刻で列を分けたいということでしょうか?
magichan

2020/01/21 16:23

であれば、前もって日付と時刻の列を分けて作成しておいてから`to_csv()` を行うべきでしょうね。 一応サンプルを追加しました。
AMK

2020/01/21 16:45

何から何まで、ありがとうございます。!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問