teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

関数を修正

2020/07/07 03:38

投稿

yymmt
yymmt

スコア1615

answer CHANGED
@@ -30,10 +30,10 @@
30
30
 
31
31
 
32
32
  def datetime_to_str(d):
33
- """datetime型は指定文字列に、それ以外はそのまま文字列に"""
33
+ """datetime型は指定文字列に、それ以外はそのまます"""
34
34
  if isinstance(d, datetime):
35
35
  return d.strftime("%Y/%m/%d %H:%M")
36
- return str(d)
36
+ return d
37
37
 
38
38
 
39
39
  def main():

2

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

2020/07/07 03:38

投稿

yymmt
yymmt

スコア1615

answer CHANGED
@@ -7,4 +7,60 @@
7
7
  df1['発売日']=df1['発売日'].dt.strftime('%Y/%m/%d %H:%M')
8
8
  df1['発送日']=df1['発送日'].dt.strftime('%Y/%m/%d %H:%M')
9
9
  df1.fillna("未定", inplace=True)
10
+ ```
11
+
12
+ [追記]
13
+ 上記の回答は日付がpandasのTimestamp型を想定しましたが、エラーの内容からdatetime型が直接代入されているようです。シリアライズするためには全てをstr型にする必要があります。一旦下記のような関数を定義して下さい。
14
+ ```python
15
+ def datetime_to_str(d):
16
+ """datetime型は指定文字列に、それ以外はそのまま返す"""
17
+ if isinstance(d, datetime):
18
+ return d.strftime("%Y/%m/%d %H:%M")
19
+ return d
20
+ ```
21
+ 上記の関数を適用するためにapplyを使用します。
22
+ ```python
23
+ df1["発売日"] = df1["発売日"].apply(datetime_to_str)
24
+ df1["配送"] = df1["配送"].apply(datetime_to_str)
25
+ ```
26
+ 参考までにソースコードの全体を示します。
27
+ ```python
28
+ import pandas as pd
29
+ from datetime import datetime
30
+
31
+
32
+ def datetime_to_str(d):
33
+ """datetime型は指定文字列に、それ以外はそのまま文字列にする"""
34
+ if isinstance(d, datetime):
35
+ return d.strftime("%Y/%m/%d %H:%M")
36
+ return str(d)
37
+
38
+
39
+ def main():
40
+ # 想定されるデータ構造を持ったデータフレームを作成
41
+ df1 = pd.DataFrame(
42
+ {
43
+ "商品名": ["A", "B", "C"],
44
+ "発売日": [
45
+ datetime.strptime("2020/7/10 12:00", "%Y/%m/%d %H:%M"),
46
+ datetime.strptime("2020/7/18 12:00", "%Y/%m/%d %H:%M"),
47
+ "未定",
48
+ ],
49
+ "配送日": [
50
+ datetime.strptime("2020/7/20 12:00", "%Y/%m/%d %H:%M"),
51
+ datetime.strptime("2020/7/24 12:00", "%Y/%m/%d %H:%M"),
52
+ "未定",
53
+ ],
54
+ "配送": ["A社", "A社", "A社"],
55
+ }
56
+ )
57
+
58
+ # 全てを文字列型に変換
59
+ df1["発売日"] = df1["発売日"].apply(datetime_to_str)
60
+ df1["配送"] = df1["配送"].apply(datetime_to_str)
61
+
62
+ # あとはSpreadsheetを更新する処理
63
+
64
+ if __name__ == "__main__":
65
+ main()
10
66
  ```

1

てにをはの修正

2020/07/07 03:36

投稿

yymmt
yymmt

スコア1615

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > TypeError: Object of type datetime is not JSON serializable
4
4
 
5
- というエラーは、datetime型をJSONに変換できない(シリアライズできない)ということです。すなわち`df1['発売日']`もしくは`df1['発送日']`もしくはその両方に`datetime型`(あるいはそれに相当する型)が含まれているということです。したがって型をシリアライズ可能な文字列型に変換すれば良いです。おそらく日付が未定のところNaTもしくはNaNとなっていてこれらもシリアライズできませんので一緒に変換する必要があります。
5
+ というエラーは、datetime型をJSONに変換できない(シリアライズできない)ということです。すなわち`df1['発売日']`もしくは`df1['発送日']`もしくはその両方に`datetime型`(あるいはそれに相当する型)が含まれているということです。したがって型をシリアライズ可能な文字列型に変換すれば良いです。おそらく日付が未定のところNaTもしくはNaNとなっていてこれらもシリアライズできませんので一緒に変換する必要があります。
6
6
  ```python
7
7
  df1['発売日']=df1['発売日'].dt.strftime('%Y/%m/%d %H:%M')
8
8
  df1['発送日']=df1['発送日'].dt.strftime('%Y/%m/%d %H:%M')