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

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

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

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

pandas

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

Q&A

解決済

3回答

4221閲覧

Pandasで日付と時刻を結合しdatetime型にしたい

barobaro

総合スコア1286

Python

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

pandas

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

0グッド

2クリップ

投稿2018/05/03 14:37

早明浦ダムのリアルタイムダム諸量一覧表のCSVを読み込んでグラフ化したいのですが
年月日と時刻を結合してdatetime型にしたいのですがうまくいきません。

日付だけだと
parse_dates=['年月日']
でdatetime型になるのですが

年月日と時刻を結合すると
parse_dates={'日時':['年月日', '時刻']}
objectになります。

どのようにすればdatetime型になるのでしょうか?

python

1import pandas as pd 2 3import requests 4from urllib.parse import urljoin 5from bs4 import BeautifulSoup 6 7# 早明浦ダムのリアルタイムダム諸量一覧表 8url = 'http://www1.river.go.jp/cgi-bin/DspDamData.exe?ID=1368080700010&KIND=3&PAGE=0' 9 10r = requests.get(url) 11 12if r.status_code == requests.codes.ok: 13 14 soup = BeautifulSoup(r.content, 'html.parser') 15 16 link = urljoin(url, soup.select_one('body > center > p > a').get('href')) 17 18 df = pd.read_csv( 19 link, 20 skiprows=9, 21 encoding='shift_jis', 22 names=[ 23 '年月日', '時刻', '流域平均雨量', '流域平均雨量属性', '貯水量', '貯水量属性', '流入量', '流入量属性', 24 '放流量', '放流量属性', '貯水率', '貯水率属性'], 25 parse_dates=['年月日'] 26 )

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

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

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

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

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

guest

回答3

0

ベストアンサー

24:00が含まれていつデータの補正用コードの例示です。

python

1import datetime 2import dateutil.parser 3 4# 関数の定義(YYYYMMDDHHMMの8桁のintを変換) 5def date_parse(x) : 6 date_txt = str(x) 7 HH = date_txt[8:10] 8 if HH == '24' : # 時間に24:00が含まれているので23時に修正 9 YYYYMMDD = date_txt[0:8] 10 result = dateutil.parser.parse(YYYYMMDD) + \ 11 datetime.timedelta(hours=23) + datetime.timedelta(minutes=50) 12 13 return result 14 else : 15 return (dateutil.parser.parse(date_txt) - datetime.timedelta(minutes=10))

上記は、00:00~00:10のデータの場合、終わりの時間(00:10)を使っていましたので始まりの時間に全てを調整するという方針で自力でパースしました。

投稿2018/05/04 02:32

R.Shigemori

総合スコア3376

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

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

barobaro

2018/05/04 04:38

ありがとうございます。 参考にして無事解決できました。 timedeltaでは24時でも大丈夫でしたので調整しなくても大丈夫みたいです。
guest

0

python

1import datetime 2 3def conv(temp): 4 H, M = map(int, temp.split(':')) 5 return datetime.timedelta(hours=H, minutes=M) 6 7 8df['日時'] = df['年月日'] + df['時刻'].apply(conv)

投稿2018/05/04 04:40

barobaro

総合スコア1286

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

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

0

read_csvの際、年月日をdatetime型にparseせず文字列として読み込み、時刻と連結した後にpd.to_datetime()でparseしてはいかがでしょうか?コードイメージは以下です。

python

1pd.to_datetime(df['年月日']+' '+df['時刻'])

投稿2018/05/03 18:27

R.Shigemori

総合スコア3376

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

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

barobaro

2018/05/04 01:54

どうも24:00があるのでエラーのような気がするのですがどうすればいいのでしょうか
R.Shigemori

2018/05/04 02:22

24:00を00:00にするようなコードを追記する必要があります。 ただ、単純に00:00に置き換えると3日の23:50の次が3日の00:00という風に時間軸が狂ってしまうので翌日になるように調整する必要があります。 以前、10分刻みのデータに24:00が含まれていた際の調整用のコードを載せておくので参考にしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問