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

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

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

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

pandas

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

Q&A

解決済

2回答

692閲覧

年月日を日数に変換したい

jonpili

総合スコア12

Python

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

pandas

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

0グッド

0クリップ

投稿2018/05/08 10:46

前提・実現したいこと

Anaconda3でPythonの勉強中です。
Excelデータにある「年月日」の値を「現在までの日数」に変換したいです。
調べても自力で出来なかったので質問させていただきます。

「2012/6/2」の形式の列です。

発生している問題・エラーメッセージ

全ての値が「5940 days 19:39:15.155828」という値になります。

該当のソースコード

Python3

1import datetime 2now = datetime.datetime.now() 3 4for i in df['X2']: 5 start = datetime.datetime.strptime(i, '%Y/%m/%d') 6 7df['X2'] = now - start

試したこと

df.locで無理そうだったのでfor文でやってみましたが上手くいきません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

YouheiSakurai

2018/05/08 10:54

「現在までの日数」の起点となる日はいつですか?
jonpili

2018/05/08 11:02

Excelファイルをデータフレーム化した物の中のX2というラベルの列に年月日がたくさんあり、それを起点としたいです。
guest

回答2

0

ベストアンサー

全ての値が「5940 days 19:39:15.155828」という値になります。

データフレームの列のそれぞれの値に対してfor文が実行されるのはおわかりでしょうか?ご質問のコードではforループを実行してはいますが毎回startという変数を上書きしているだけなので列の最後の値だけがstartに残るため最後に代入した結果が同じ値になってしまうのです。

列のそれぞれの値になんらかの計算を施す場合、四則演算などですと一々ループを書かなくてもdataframe['column-name'] * 10と書くだけで「列の個々の要素それぞれに10を乗じる」という機能になってますね。

では自分で定義した演算(関数)をどうやって個々の要素に適用するかといえば一つの方法としてapplyを使う方法があると思います。

python

1def diff_from_now(v): 2 return now - datetime.datetime.strptime(v, '%Y/%m/%d')) 3 4df['X2'] = df['X2'].apply(diff_from_now) 5 6# または直接lambda式として関数を指定してもよい 7 8df['X2'] = df['X2'].apply(lambda v: \ 9 now - datetime.datetime.strptime(v, '%Y/%m/%d'))

投稿2018/05/08 11:24

KSwordOfHaste

総合スコア18392

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

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

jonpili

2018/05/08 11:27

ご回答ありがとうございます! startが毎回上書きされてるんですね!納得しました! くださったコードも早速読ませて頂きます!
jonpili

2018/05/08 11:32

ありがとうございます!! 正しく日数が出てきました! 本でコードをたくさん学んだつもりでしたがapplyもlambdaも初見でした。 これから適宜使っていこうと思います! ご回答ありがとうございました!
KSwordOfHaste

2018/05/08 11:49

ある程度慣れてきたらSeriesなど重要なクラスのメソッドにどんな品揃えがあるかを少し研究しておくとおそらくプログラミングの幅が広がると思います。自分はプログラミングする際によく使うようになってきたクラス、例えばnumpy.ndarrayなどは何か調べるついでに「どんな機能があるのかなー」とリファレンスを眺めることがあります。たまにそういうことをしていると少しずつ発見(便利な機能の発見)ができると思います。
jonpili

2018/05/08 11:51

ありがとうございます☺ そのように勉強していこうと思います!!
guest

0

C#の例ですが、これを一つの関数に実装しましょう

西暦1年1月1日からの通算日数を調べる

これを対象の年月日について出し、現在との差分を算出すればいいという話になります


楽をするならdatetimeで、timedelta出してゴソゴソ、ということに

投稿2018/05/08 10:56

編集2018/05/08 11:03
y_waiwai

総合スコア87715

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

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

jonpili

2018/05/08 11:11

ご回答ありがとうございます。 その考え方でExcelファイルの年月日文字列をdatetime.strptimeでタイムデルタに変換し、現在のタイムデルタとの差分を列データに代入したつもりでした。 どこの考え方が違うのかお教えくださると幸いです。
y_waiwai

2018/05/08 11:33

strptimeは文字列をdatetimeに変換するメソッドですね Excelからなら、Excelの日付データをdatetimeに変換するのを考えたほうが良さそうですが
jonpili

2018/05/08 11:50

なるほど! 日付データ=文字列という認識が勘違いだったのですね。 Excelのデータ形式について勉強してきます! ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問