goo blog サービス終了のお知らせ 

Shizuka's Style (Tre)

旧yaplogのShizuka's Style (Duo)から記事ごと引っ越しました。今後ともよろしく!

pythonでdatetimeを0埋めしたくない時の対応。。

2020-05-18 16:44:51 | Python
ある課題で、Pythonでの時刻や時間を0埋めせずに取り出す必要が出たのですが、こちらもはまったので備忘まで記事を残します。

まずは、「Pythonで日付出力の0埋めを取り除くメモ」さんを参考に、「dt.strftime('%Y/%-m/%-d %-H:%-M')」を試したのですが、Linuxでは動いても私のIDE環境(Windows上のSpider)ではエラーになって動きません。

次に「Python datetime 0埋めしない方法(Windows)」さんを参考に、「.lstrip("0")」を試したのですが、これ、0が全てstripされてしまうので、00時とか00分が投入されると空っぽになってしまい、その後の処理が大変です。

そこでふと立ち戻って考えると、そもそも”00”というのはint型にすると0になりますし、”01”も1になるはずでは?と思いつき、
===
time_str = "00:00"
a = time_str.split(":")
print ((str(int(a[0]))) + ":" + (str(int(a[1]))))
===
こんな感じで0埋め無しにしたい時間文字列を一旦、取り込みint型にして、それを更にstr型にするという力業で解決してみました。一応、これでも何とかはなるけど、あまりに力わざだし何だかなぁと思っていたら、、、

===
(2-1)strptimeメソッドで変更する
.strftime('%Y/%#m/%#d')
 └ 例:「today.strftime("%Y/%#m/%#d")」
 └ 「%Y」:西暦 (4桁) の 10進数(※%yは2桁)
 └ 「%#m」:0埋めなし10進数の月(※%Mは分)
 └ 「%#d」:0埋めなし10進数の日にち(%Dはmm/dd/yy)
===
と書かれており、、これで解決することが出来ました。
WindowsとLinuxやMacでは挙動が違うのですね。。。

しかし、、となると、プラットフォーム毎に異なる処理を入れないとならない訳で、全てのOSで共通プログラムにしたいなら、あながち力わざも間違ってなくて、ありなのかもしれません。
それはそれでどうかと思いますが。いすれにしても備忘まで記事を残しておきます。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

python numpyでのtolist()は不等長配列では動かないみたいにみえる

2020-05-15 14:44:59 | Python
最近、pythonの勉強をしているのですが、どうにも仕様がおかしい動きをする関数ではまり、小一時間悩んでしまったので、備忘のため記事を残します。

まず、以下のソースを見て下さい。
===
import numpy as np
def split_list(items):
 ra = np.array(np.array_split(items, 2, 0)).tolist()

 print (list (ra))
 print (type (ra))
 print (type (ra[0]))
 print ('\n')
===
numpyをインポートし、array_splitをつかって2分割し、それをtolist()を使ってlist型のraに変換、結果とその型を表示しているプログラムです。

さて、これを「split_list([1, 2, 3, 4, 5, 6])」として呼び出します。
===
[[1, 2, 3], [4, 5, 6]]
<class 'list'>
<class 'list'>
===
と表示され、確かに結果がlist型に変換されているように見えます。
ところが。「split_list([1, 2, 3])」として呼び出しますと。。。
===
[array([1, 2]), array([3])]
<class 'list'>
<class 'numpy.ndarray'>
===
あれ?!tolist()でリスト型にしているはずなのにndarrayになっている。。
 →そもそもarray()って表示される意味自体を理解するまでが大変でした

色々調べたのですが、tolist()はリスト型にしてくれるはずなのに、何故か不等長配列を返す場合はどうやってもndarrayが返って来る現象を解決出来ませんでした。

この現象は仕様なのか、それとも私の使い方が悪いのか、初心者なのでよくわかりませんが、ネット上にこれを解決する手段は全く載ってなくて、、、
結局、力業とはわかっていて仕方なく、
===
import numpy as np
def split_list(items):
 rs = []
 ra = np.array(np.array_split(items, 2, 0)).tolist()

 for i in ra:
  rs.insert(len(rs), list(i))

 print (list (rs))
 print (type (rs))
 print (type (rs[0]))
 print ('\n')
===
と、むりやりリスト型指定で新しい配列(rs)を作ってやると

===
[[1, 2, 3], [4, 5, 6]]
<class 'list'>
<class 'list'>

[[1, 2], [3]]
<class 'list'>
<class 'list'>
===
どちらのケースでもリスト型で返るようになりました。

これ多分、自分の理解が足りていないんだと思うので、一旦は深追いするのは止めますが、関数が想定通りに動かないときは焦りますね。。奥が深いなぁ。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする