熊猫时间天数

luc*_*ool 26 python timestamp numpy pandas

我在pandas中有一个名为'munged_data'的数据框,其中有两列'entry_date'和'dob',我已经使用pd.to_timestamp转换为Timestamps.我正在试图找出如何根据时间差来计算人的年龄. entry_date'和'dob'并且为了做到这一点,我需要在两列之间获得天数的差异(这样我就可以像圆形(天/ 365.25)那样做.我似乎无法找到方法使用矢量化操作执行此操作.当我执行munged_data.entry_date-munged_data.dob时,我得到以下内容:

internal_quote_id
2                    15685977 days, 23:54:30.457856
3                    11651985 days, 23:49:15.359744
4                     9491988 days, 23:39:55.621376
7                     11907004 days, 0:10:30.196224
9                    15282164 days, 23:30:30.196224
15                  15282227 days, 23:50:40.261632  
Run Code Online (Sandbox Code Playgroud)

但是我似乎无法将整数提取为整数,以便我可以继续计算.任何帮助赞赏.

Dan*_*anT 47

使用Timedelta自v0.15.0以来可用的Pandas类型,您还可以:

In[1]: import pandas as pd
In[2]: df = pd.DataFrame([ pd.Timestamp('20150111'), 
                           pd.Timestamp('20150301') ], columns=['date'])
In[3]: df['today'] = pd.Timestamp('20150315')
In[4]: df
Out[4]: 
        date      today
0 2015-01-11 2015-03-15
1 2015-03-01 2015-03-15

In[5]: (df['today'] - df['date']).dt.days
Out[5]: 
0    63
1    14
dtype: int64
Run Code Online (Sandbox Code Playgroud)

  • `Timedelta.dt.days` 比 `apply(lambda x: x.days())` 快 100 倍 (2认同)

Jef*_*eff 18

你需要0.11(0.11rc1出局,下周最后一次出场)

In [9]: df = DataFrame([ Timestamp('20010101'), Timestamp('20040601') ])

In [10]: df
Out[10]: 
                    0
0 2001-01-01 00:00:00
1 2004-06-01 00:00:00

In [11]: df = DataFrame([ Timestamp('20010101'), 
                          Timestamp('20040601') ],columns=['age'])

In [12]: df
Out[12]: 
                  age
0 2001-01-01 00:00:00
1 2004-06-01 00:00:00

In [13]: df['today'] = Timestamp('20130419')

In [14]: df['diff'] = df['today']-df['age']

In [16]: df['years'] = df['diff'].apply(lambda x: float(x.item().days)/365)

In [17]: df
Out[17]: 
                  age               today                diff      years
0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00  12.304110
1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00   8.887671
Run Code Online (Sandbox Code Playgroud)

你最后需要这个奇怪的应用,因为尚未完全支持timedelta64 [ns]标量(例如我们现在如何使用timestamps为datetime64 [ns],进入0.12)


Ayr*_*rat 12

不确定你是否仍然需要它,但在Pandas 0.14我通常使用.astype('timedelta64 [X]')方法 http://pandas.pydata.org/pandas-docs/stable/timeseries.html(变频)

df = pd.DataFrame([ pd.Timestamp('20010101'), pd.Timestamp('20040605') ])
df.ix[0]-df.ix[1]
Run Code Online (Sandbox Code Playgroud)

返回:

0   -1251 days
dtype: timedelta64[ns]
Run Code Online (Sandbox Code Playgroud)
(df.ix[0]-df.ix[1]).astype('timedelta64[Y]')
Run Code Online (Sandbox Code Playgroud)

返回:

  0   -4
 dtype: float64
Run Code Online (Sandbox Code Playgroud)

希望有所帮助

  • 我刚刚用谷歌搜索并发现了这个问题。我的问题是我对我的数据框使用了类似于 Jeff 答案的东西。然而,我有大约一百万行,所以应用有点慢。使用 `.astype('timedelta64[D]')` 是一种更快的方法(大约 200 倍) (2认同)

Dan*_*son 6

让我们指定你有一个名为time_difference的pandas系列,其类型为numpy.timedelta64 [ns]

提取当天(或任何所需属性)的一种方法如下:

just_day = time_difference.apply(lambda x: pd.tslib.Timedelta(x).days)
Run Code Online (Sandbox Code Playgroud)

使用此函数是因为numpy.timedelta64对象没有'days'属性.


lua*_*art 5

要将任何类型的数据转换为天数,只需使用Timedelta().days:

pd.Timedelta(1985, unit='Y').days
84494
Run Code Online (Sandbox Code Playgroud)