回答編集履歴

3

関数を修正

2020/07/07 03:38

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -62,13 +62,13 @@
62
62
 
63
63
  def datetime_to_str(d):
64
64
 
65
- """datetime型は指定文字列に、それ以外はそのまま文字列に"""
65
+ """datetime型は指定文字列に、それ以外はそのまます"""
66
66
 
67
67
  if isinstance(d, datetime):
68
68
 
69
69
  return d.strftime("%Y/%m/%d %H:%M")
70
70
 
71
- return str(d)
71
+ return d
72
72
 
73
73
 
74
74
 

2

文字列型に変換するコードを追記

2020/07/07 03:38

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -17,3 +17,115 @@
17
17
  df1.fillna("未定", inplace=True)
18
18
 
19
19
  ```
20
+
21
+
22
+
23
+ [追記]
24
+
25
+ 上記の回答は日付がpandasのTimestamp型を想定しましたが、エラーの内容からdatetime型が直接代入されているようです。シリアライズするためには全てをstr型にする必要があります。一旦下記のような関数を定義して下さい。
26
+
27
+ ```python
28
+
29
+ def datetime_to_str(d):
30
+
31
+ """datetime型は指定文字列に、それ以外はそのまま返す"""
32
+
33
+ if isinstance(d, datetime):
34
+
35
+ return d.strftime("%Y/%m/%d %H:%M")
36
+
37
+ return d
38
+
39
+ ```
40
+
41
+ 上記の関数を適用するためにapplyを使用します。
42
+
43
+ ```python
44
+
45
+ df1["発売日"] = df1["発売日"].apply(datetime_to_str)
46
+
47
+ df1["配送"] = df1["配送"].apply(datetime_to_str)
48
+
49
+ ```
50
+
51
+ 参考までにソースコードの全体を示します。
52
+
53
+ ```python
54
+
55
+ import pandas as pd
56
+
57
+ from datetime import datetime
58
+
59
+
60
+
61
+
62
+
63
+ def datetime_to_str(d):
64
+
65
+ """datetime型は指定文字列に、それ以外はそのまま文字列にする"""
66
+
67
+ if isinstance(d, datetime):
68
+
69
+ return d.strftime("%Y/%m/%d %H:%M")
70
+
71
+ return str(d)
72
+
73
+
74
+
75
+
76
+
77
+ def main():
78
+
79
+ # 想定されるデータ構造を持ったデータフレームを作成
80
+
81
+ df1 = pd.DataFrame(
82
+
83
+ {
84
+
85
+ "商品名": ["A", "B", "C"],
86
+
87
+ "発売日": [
88
+
89
+ datetime.strptime("2020/7/10 12:00", "%Y/%m/%d %H:%M"),
90
+
91
+ datetime.strptime("2020/7/18 12:00", "%Y/%m/%d %H:%M"),
92
+
93
+ "未定",
94
+
95
+ ],
96
+
97
+ "配送日": [
98
+
99
+ datetime.strptime("2020/7/20 12:00", "%Y/%m/%d %H:%M"),
100
+
101
+ datetime.strptime("2020/7/24 12:00", "%Y/%m/%d %H:%M"),
102
+
103
+ "未定",
104
+
105
+ ],
106
+
107
+ "配送": ["A社", "A社", "A社"],
108
+
109
+ }
110
+
111
+ )
112
+
113
+
114
+
115
+ # 全てを文字列型に変換
116
+
117
+ df1["発売日"] = df1["発売日"].apply(datetime_to_str)
118
+
119
+ df1["配送"] = df1["配送"].apply(datetime_to_str)
120
+
121
+
122
+
123
+ # あとはSpreadsheetを更新する処理
124
+
125
+
126
+
127
+ if __name__ == "__main__":
128
+
129
+ main()
130
+
131
+ ```

1

てにをはの修正

2020/07/07 03:36

投稿

yymmt
yymmt

スコア1615

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