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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

DateTime

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

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

pandas

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

Q&A

解決済

1回答

3686閲覧

【pandas】dataframe(日付データを含む)をスプレッドシートのセルに書き込む方法について

beginner.py

総合スコア8

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

DateTime

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

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

pandas

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

0グッド

0クリップ

投稿2020/07/06 10:00

こんにちは

python初心者です
スプレッドシート×pandasで日付の処理に困っており、質問させてください

以下のエクセルを
df1 として読み込んだ際に

|商品名|発売日|発送日|配送|
|:--|:--:|--:|
|A|2020/7/10 12:00|2020/7/20 12:00|A社|
|B|2020/7/18 12:00|2020/7/24 12:00|A社|
|C|未定|未定|A社|

上記のデータをスプレッドシートの特定シートの特定セルに張り付けるために下記コードを書きました

python

1 2 3#df1の最終行列の把握 4col_lastnum = len(df1.columns) 5row_lastnum = len(df1.index) 6 7#--------------------------------------------------------------------------------------------------------------------# 8#スプレッドシートの準備 9#--------------------------------------------------------------------------------------------------------------------# 10 11#ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。 12from oauth2client.service_account import ServiceAccountCredentials 13 14#2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない 15scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] 16 17#認証情報設定 18#ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く) 19credentials = ServiceAccountCredentials.from_json_keyfile_name(r'C:\Users\xxxxxxx\Desktop\12_pyworks\python.json', scope) 20 21#OAuth2の資格情報を使用してGoogle APIにログインします。 22gc = gspread.authorize(credentials) 23 24#共有設定したスプレッドシートキーを変数[SPREADSHEET_KEY]に格納する。 25SPREADSHEET_KEY = 'xxxxxxxxxxxxxxxxxxxxx' 26 27#共有設定したスプレッドシートのテストシートを開く 28ws = gc.open_by_key(SPREADSHEET_KEY).worksheet('テスト') 29 30#更新するセル範囲 df1の範囲を考慮に入れて算出 31cell_list = ws.range('A1:D'+str(row_lastnum)) 32 33#--------------------------------------------------------------------------------------------------------------------# 34#df1のデータをスプレッドシートに書き込み 35#--------------------------------------------------------------------------------------------------------------------# 36 37#セルリストの範囲にdf1の値を代入していく 38for cell in cell_list: 39 values = df1.iloc[cell.row-1][cell.col-1] 40 cell.value = values 41ws.update_cells(cell_list) 42

エラー内容

TypeError: Object of type datetime is not JSON serializable

日付データがJSONで定義されていないため、エラーが発生しているようです
※df1.dtypesで確認すると全ての情報がobjectとなっております

発売日と発送日の日付に”未定”というテキストもが入っているのですが、
うまくスプレッドシートに移行させることは可能でしょうか。
df1で読み込んだエクセル内容を変更することはできません。

試してみたこと

日付の形式を変えてみようと思ったのですがテキストが入っているため変換などもできず・・。

python

1df1['発売日']=pd.to_datetime(df1['発売日']) 2df1['発送日']=pd.to_datetime(df1['発送日']) 3 4**エラー** 5Unknown string format: 未定 6

何かアドバイスなどいただけると大変助かります。
お忙しいところ恐縮ですが、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの解釈が間違っています。

TypeError: Object of type datetime is not JSON serializable

というエラーは、datetime型をJSONに変換できない(シリアライズできない)ということです。すなわちdf1['発売日']もしくはdf1['発送日']もしくはその両方にdatetime型(あるいはそれに相当する型)が含まれているということです。したがって型をシリアライズ可能な文字列型に変換すれば良いです。おそらく日付が未定のところはNaTもしくはNaNとなっていてこれらもシリアライズできませんので一緒に変換する必要があります。

python

1df1['発売日']=df1['発売日'].dt.strftime('%Y/%m/%d %H:%M') 2df1['発送日']=df1['発送日'].dt.strftime('%Y/%m/%d %H:%M') 3df1.fillna("未定", inplace=True)

[追記]
上記の回答は日付がpandasのTimestamp型を想定しましたが、エラーの内容からdatetime型が直接代入されているようです。シリアライズするためには全てをstr型にする必要があります。一旦下記のような関数を定義して下さい。

python

1def datetime_to_str(d): 2 """datetime型は指定文字列に、それ以外はそのまま返す""" 3 if isinstance(d, datetime): 4 return d.strftime("%Y/%m/%d %H:%M") 5 return d

上記の関数を適用するためにapplyを使用します。

python

1df1["発売日"] = df1["発売日"].apply(datetime_to_str) 2df1["配送"] = df1["配送"].apply(datetime_to_str)

参考までにソースコードの全体を示します。

python

1import pandas as pd 2from datetime import datetime 3 4 5def datetime_to_str(d): 6 """datetime型は指定文字列に、それ以外はそのまま返す""" 7 if isinstance(d, datetime): 8 return d.strftime("%Y/%m/%d %H:%M") 9 return d 10 11 12def main(): 13 # 想定されるデータ構造を持ったデータフレームを作成 14 df1 = pd.DataFrame( 15 { 16 "商品名": ["A", "B", "C"], 17 "発売日": [ 18 datetime.strptime("2020/7/10 12:00", "%Y/%m/%d %H:%M"), 19 datetime.strptime("2020/7/18 12:00", "%Y/%m/%d %H:%M"), 20 "未定", 21 ], 22 "配送日": [ 23 datetime.strptime("2020/7/20 12:00", "%Y/%m/%d %H:%M"), 24 datetime.strptime("2020/7/24 12:00", "%Y/%m/%d %H:%M"), 25 "未定", 26 ], 27 "配送": ["A社", "A社", "A社"], 28 } 29 ) 30 31 # 全てを文字列型に変換 32 df1["発売日"] = df1["発売日"].apply(datetime_to_str) 33 df1["配送"] = df1["配送"].apply(datetime_to_str) 34 35 # あとはSpreadsheetを更新する処理 36 37if __name__ == "__main__": 38 main()

投稿2020/07/06 11:29

編集2020/07/07 03:38
yymmt

総合スコア1615

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

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

beginner.py

2020/07/07 00:42

yymmt様 ご回答いただきありがとうございます。 解説内容、とてもよくわかりました。ありがとうございます。 今試してみたところ 下記のようなエラーコードが出てしまってます。 Can only use .dt accessor with datetimelike values つまりこれはエクセルで読み込んだdf1の発売日と発送日の日付データが datetimelike valuesではないということなのですよね。 なので、いただいたコードの前に下記コードで発売日と発送日をdatetime型にしようとしたのですが df1['発売日'] = pd.to_datetime(df1['発売日']) df1['発送日'] = pd.to_datetime(df1['発送日']) 下記エラーコードが出ておりまして。。 Unknown string format: 未定 上記何か対応策があれば、大変お手数ですが、ご教授いただけると幸いでございます。
beginner.py

2020/07/07 02:45 編集

本件、前処理で未定を一旦日付に直したら無事エラーがなくなりました。 ありがとうございました。 df1['発売日'] = df1['発売日'].str.replace('未定', '2020/3/31 12:00') df1['発送日'] = df1['発送日'].str.replace('未定', '2020/3/31 12:00')
yymmt

2020/07/07 03:23

状況としては1つの列にdatetime型とstr型(未定の文字列)が含まれていて、一括変換ができなかった、ということです。対処方法は長くなりそうなので回答欄に追記します。
beginner.py

2020/07/07 06:48

yymmt様 追記ありがとうございます。またコードの全容まで大変助かります。 いただいた内容を参考にさせていただきましたところ、うまくいきました???? 特に下記コード、大変参考になりました。 def datetime_to_str(d): """datetime型は指定文字列に、それ以外はそのまま返す""" if isinstance(d, datetime): return d.strftime("%Y/%m/%d %H:%M") return d 本当に助かりました。 貴重なお時間をいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問