82

最初の 3 列が「MONTH」、「DAY」、「YEAR」であるデータフレームがあります。

各列には整数があります。データフレームにある間に3つの列すべてを日時に変換するPythonicの方法はありますか?

から:

M    D    Y    Apples   Oranges
5    6  1990      12        3
5    7  1990      14        4
5    8  1990      15       34
5    9  1990      23       21

の中へ:

Datetimes    Apples   Oranges
1990-6-5        12        3
1990-7-5        14        4
1990-8-5        15       34
1990-9-5        23       21
4

8 に答える 8

67

0.13 (近日公開予定) では、これは大幅に最適化されており、非常に高速です (ただし、0.12 でもかなり高速です)。ループよりも桁違いに速い

In [3]: df
Out[3]: 
   M  D     Y  Apples  Oranges
0  5  6  1990      12        3
1  5  7  1990      14        4
2  5  8  1990      15       34
3  5  9  1990      23       21

In [4]: df.dtypes
Out[4]: 
M          int64
D          int64
Y          int64
Apples     int64
Oranges    int64
dtype: object

# in 0.12, use this
In [5]: pd.to_datetime((df.Y*10000+df.M*100+df.D).apply(str),format='%Y%m%d')

# in 0.13 the above or this will work
In [5]: pd.to_datetime(df.Y*10000+df.M*100+df.D,format='%Y%m%d')
Out[5]: 
0   1990-05-06 00:00:00
1   1990-05-07 00:00:00
2   1990-05-08 00:00:00
3   1990-05-09 00:00:00
dtype: datetime64[ns]
于 2013-10-13T22:23:53.500 に答える
8

NumPy datetime64 および timedelta64 演算を使用する代替方法を次に示します。小さな DataFrame の場合は少し速く、大きな DataFrame の場合ははるかに速いようです。

import numpy as np
import pandas as pd

df = pd.DataFrame({'M':[1,2,3,4], 'D':[6,7,8,9], 'Y':[1990,1991,1992,1993]})
#    D  M     Y
# 0  6  1  1990
# 1  7  2  1991
# 2  8  3  1992
# 3  9  4  1993

y = np.array(df['Y']-1970, dtype='<M8[Y]')
m = np.array(df['M']-1, dtype='<m8[M]')
d = np.array(df['D']-1, dtype='<m8[D]')
dates2 = pd.Series(y+m+d)
# 0   1990-01-06
# 1   1991-02-07
# 2   1992-03-08
# 3   1993-04-09
# dtype: datetime64[ns]

In [214]: df = pd.concat([df]*1000)

In [215]: %timeit pd.to_datetime((df['Y']*10000+df['M']*100+df['D']).astype('int'), format='%Y%m%d')
100 loops, best of 3: 4.87 ms per loop

In [216]: %timeit pd.Series(np.array(df['Y']-1970, dtype='<M8[Y]')+np.array(df['M']-1, dtype='<m8[M]')+np.array(df['D']-1, dtype='<m8[D]'))
1000 loops, best of 3: 839 µs per loop

これを使いやすくするためのヘルパー関数を次に示します。

def combine64(years, months=1, days=1, weeks=None, hours=None, minutes=None,
              seconds=None, milliseconds=None, microseconds=None, nanoseconds=None):
    years = np.asarray(years) - 1970
    months = np.asarray(months) - 1
    days = np.asarray(days) - 1
    types = ('<M8[Y]', '<m8[M]', '<m8[D]', '<m8[W]', '<m8[h]',
             '<m8[m]', '<m8[s]', '<m8[ms]', '<m8[us]', '<m8[ns]')
    vals = (years, months, days, weeks, hours, minutes, seconds,
            milliseconds, microseconds, nanoseconds)
    return sum(np.asarray(v, dtype=t) for t, v in zip(types, vals)
               if v is not None)

In [437]: combine64(df['Y'], df['M'], df['D'])
Out[437]: array(['1990-01-06', '1991-02-07', '1992-03-08', '1993-04-09'], dtype='datetime64[D]')
于 2014-09-01T19:39:47.627 に答える
5

問題に再び取り組み、解決策を見つけたと思います。次の方法で csv ファイルを初期化しました。

pandas_object = DataFrame(read_csv('/Path/to/csv/file', parse_dates=True, index_col = [2,0,1] ))

どこ:

index_col = [2,0,1]

[年、月、日]の列を表します

唯一の問題は、3 つの新しいインデックス列ができたことです。1 つは年を表し、もう 1 つは月を表し、もう 1 つは日を表します。

于 2013-10-13T23:30:46.787 に答える
1

簡単に文字列を連結できるように、データフレームを文字列に変換します。

df=df.astype(str)

次に日時に変換し、形式を指定します。

df.index=pd.to_datetime(df.Y+df.M+df.D,format="%Y%m%d")

新しい列を作成するのではなく、インデックスを置き換えます。

于 2015-06-10T04:30:58.187 に答える
1
 [pd.to_datetime(str(a)+str(b)+str(c),
                 format='%m%d%Y'
                ) for a,b,c in zip(df.M, df.D, df.Y)]
于 2016-11-01T13:51:41.467 に答える
0

foo並列に日付の各列を含む辞書があると仮定しましょう。もしそうなら、ここにあなたのワンライナーがあります:

>>> from datetime import datetime
>>> foo = {"M": [1,2,3], "D":[30,30,21], "Y":[1980,1981,1982]}
>>>
>>> df = pd.DataFrame({"Datetime": [datetime(y,m,d) for y,m,d in zip(foo["Y"],foo["M"],foo["D"])]})

それの本当の根性はこのビットです:

>>> [datetime(y,m,d) for y,m,d in zip(foo["Y"],foo["M"],foo["D"])]
[datetime.datetime(1980, 1, 30, 0, 0), datetime.datetime(1981, 2, 28, 0, 0), datetime.datetime(1982, 3, 21, 0, 0)]

これは、そのようなもののzipために作られました。並列リストを取り、それらをタプルに変換します。for y,m,d in次に、そこでリスト内包表記によってタプルがアンパック (ビット) され、datetimeオブジェクト コンストラクターに渡されます。

pandasdatetime オブジェクトに満足しているようです。

于 2015-06-10T04:44:12.477 に答える