🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

pandas

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

Q&A

解決済

3回答

1110閲覧

時系列データの日時データへの変換について

mi2

総合スコア63

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

pandas

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

0グッド

0クリップ

投稿2019/09/10 12:36

達成したいこと

dfに入ったタイムスタンプについて、正規表現を使って、ミリ秒まであるデータの年、月、日、時、分まで取得したいです。
1レコードにカンマ区切りで年~ミリ秒まで入っていて処理に困っております。

想定されるデータ

データフレームに入っているtimestampを想定しています。

timestamp
2019, 1, 1, 1, 2, 30, 60500
2019, 1, 1, 1, 3, 31, 71800
2019, 1, 1, 1, 4, 32, 24500
2019, 1, 1, 1, 5, 33, 92100

試したこと

pd.to_datetime(df['timestamp'].replace(', [0-9]{4,}', '', regex=True), format = '%Y, %m, %d, %H, %M')

中にはミリ秒や描画省略されているものもあり、上記だとエラーが出てしまうようです。

以上の件につきまして、何卒よろしくお願い申し上げます。

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

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

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

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

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

guest

回答3

0

ベストアンサー

とりあえず、ワンライナーで書いてみました(2種類)。

Python

1import pandas as pd 2from datetime import datetime 3 4df = pd.DataFrame({'timestamp': ['2019, 1, 1, 1, 2, 30, 60500', 5 '2019, 1, 1, 1, 3, 31, 71800', 6 '2019, 1, 1, 1, 4, 32, 24500', 7 '2019, 1, 1, 1, 5, 33, 92100', 8 '2019, 1, 1, 1, 6, 34', 9 '2019, 1, 1, 1, 7']}) 10 11# DataFrame.apply() でdatetimeに変換する方法 12ret = df['timestamp'].str.split(',', expand=True).iloc[:,:5].astype(int).apply(lambda d: datetime(*d), axis=1) 13#0 2019-01-01 01:02:00 14#1 2019-01-01 01:03:00 15#2 2019-01-01 01:04:00 16#3 2019-01-01 01:05:00 17#4 2019-01-01 01:06:00 18#5 2019-01-01 01:07:00 19#dtype: datetime64[ns] 20 21# pandas.to_datetime() でdatetimeに変換する方法 22ret = pd.to_datetime(df['timestamp'].str.split(',', expand=True).iloc[:,:5].astype(int).rename(columns={0:'year',1:'month',2:'day',3:'hour',4:'minute'})) 23#0 2019-01-01 01:02:00 24#1 2019-01-01 01:03:00 25#2 2019-01-01 01:04:00 26#3 2019-01-01 01:05:00 27#4 2019-01-01 01:06:00 28#5 2019-01-01 01:07:00 29#dtype: datetime64[ns]

投稿2019/09/11 05:26

magichan

総合スコア15898

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

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

0

元のDataFrameをdfとします。Series timestampをカンマ区切りの日時(年からミリ秒まで)とします。

Python

1df2 = df['timestamp'].str.split(',', expand=True) 2df['timestamp'] = df2[0] + '-' + df2[1] + '-' + df2[2] + ' ' + df2[3] + ':' + df2[4] + ':' + df[5] 3df['timestamp'] = pd.to_datetime(df['timestamp'])

投稿2019/09/10 13:48

meg_

総合スコア10736

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

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

0

かなり冗長ですが、以下のように変換できます。

Python

1import pandas as pd 2from io import StringIO 3 4s = """timestamp 52019,1,1,1,2,30,60500 62019, 1, 1, 1, 3, 31 72019, 1, 1, 1, 4""" 8df = pd.read_csv( StringIO(s), sep='\t') 9 10def f(s): 11 l = s.split(',') 12 l = l[:5] # 分まで 13 l = [v.strip() for v in l] 14 s = ','.join(l) 15 dt = pd.to_datetime(s, format='%Y,%m,%d,%H,%M') 16 return dt 17 18sr = df['timestamp'].apply(f) 19print(sr) 20 21# あるいは以下でも可 22sr = df['timestamp'].apply(lambda s:pd.to_datetime(','.join(map(lambda v: v.strip(), s.split(',')[:5])), format='%Y,%m,%d,%H,%M')) 23print(sr) 24 25#0 2019-01-01 01:02:00 26#1 2019-01-01 01:03:00 27#2 2019-01-01 01:04:00 28

投稿2019/09/10 13:14

can110

総合スコア38341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問