Ame*_*ina 6 python numpy pandas
当我计算两个大熊猫datetime64日期之间的差异时,我得到了np.timedelta64.有没有简单的方法将这些增量转换为小时,天,周等表示?
我找不到任何方法np.timedelta64来促进不同单位之间的转换,但看起来Pandas似乎知道如何在打印timedeltas时将这些单位转换为天数(例如我得到:29 days, 23:20:00在字符串表示数据帧中).有权访问此功能吗?
奇怪的是,以下工作都没有:
> df['column_with_times'].days
> df['column_with_times'].apply(lambda x: x.days)
Run Code Online (Sandbox Code Playgroud)
但是这个确实:
df['column_with_times'][0].days
Run Code Online (Sandbox Code Playgroud)
pandas 将 timedelta 数据存储在 numpytimedelta64[ns]类型中,但也提供了Timedelta包装此数据的类型以方便使用(例如,提供日期、小时、.. 和其他组件的访问器)。
In [41]: timedelta_col = pd.Series(pd.timedelta_range('1 days', periods=5, freq='2 h'))
In [42]: timedelta_col
Out[42]:
0 1 days 00:00:00
1 1 days 02:00:00
2 1 days 04:00:00
3 1 days 06:00:00
4 1 days 08:00:00
dtype: timedelta64[ns]
Run Code Online (Sandbox Code Playgroud)
要访问完整列(系列)的不同组件,您必须使用.dt访问器。例如:
In [43]: timedelta_col.dt.hours
Out[43]:
0 0
1 2
2 4
3 6
4 8
dtype: int64
Run Code Online (Sandbox Code Playgroud)
这样timedelta_col.dt.components您就得到了一个框架,其中所有不同的组件(天到纳秒)作为不同的列。
当访问上面一列的一个值时,这会返回一个Timedelta,此时您不需要使用dt访问器,但您可以直接访问组件:
In [45]: timedelta_col[0]
Out[45]: Timedelta('1 days 00:00:00')
In [46]: timedelta_col[0].days
Out[46]: 1L
Run Code Online (Sandbox Code Playgroud)
因此,.dt访问器提供对标量属性的访问Timedelta,但是是在整个列上。df['column_with_times'][0].days这就是你看到它有效但无效的原因df['column_with_times'].days。不起作用
的原因是 apply 被赋予了值(而不是pandas 类型),而这些值没有这样的属性。df['column_with_times'].apply(lambda x: x.days)timedelta64Timedelta