我的数据框中有一个'datedif'列:
exposuredate min_exposure_date datedif
2014-10-08 2014-09-27 11 days
2014-10-09 2014-09-27 12 days
2014-09-27 2014-09-27 0 days
2014-09-27 2014-09-27 0 days
2014-10-22 2014-09-27 25 days
data.exposuredate = pd.to_datetime(data.exposuredate)
data.min_exposure_date = pd.to_datetime(data.min_exposure_date)
data['datedif'] = ((data.exposuredate)-(data.min_exposure_date))
列的格式为datetime64 [ns]。我想提取字段'datedif'中的天数。我无法找到任何可以帮助我提取天数差异的内容。
我试过了: data ['datedif_day'] = data ['datedif']。dt.days
错误:AttributeError:'Series'对象没有属性'dt'
答案 0 :(得分:3)
'datedif'以天的形式显示,但实际上是以秒为单位。因此,为了获得更多天数,请在代码中添加以下行: data ['datedif'] = data ['datedif']。astype(np.numpy64) data ['datedif_day'] =(data ['datedif'] / 86400000000000)
答案 1 :(得分:2)
Pandas文档与您要查找的转化类型相关Frequency Conversion
这两个选项是1)由Timedelta划分或2)类型转换。如文档中所述,两者之间存在细微差别:
"请注意,numpy标量除法是真正的除法,而astyping相当于地板除法。"
data = pd.DataFrame([("2014-10-08", "2014-09-27"),
("2014-10-09", "2014-09-27"),
("2014-09-27", "2014-09-27"),
("2014-10-22", "2014-09-27")],
columns=["exposuredate", "min_exposure_date"])
data['datediff'] = pd.to_datetime(data.exposuredate)
- pd.to_datetime(data.min_exposure_date)
data['datediff'] / pd.Timedelta(1, unit='d')
data['datediff'].astype('timedelta64[D]')
两种操作均产生:
0 11.0
1 12.0
2 0.0
3 25.0
Name: datediff, dtype: float64
如果您使用日期差异作为训练机器学习算法的功能,那么它们表示的形式并不重要,因为无论如何它们应该被标准化。 timedelta64[ns]
对此完全没问题。在可视化方面,请参阅this post。
答案 2 :(得分:1)
今天也遇到同样的问题,我认为以下甜蛋白最简单:
设置:
df = pd.DataFrame([("2014-10-08", "2014-09-27"),
("2014-10-09", "2014-09-27"),
("2014-09-27", "2014-09-27"),
("2014-10-22", "2014-09-27")],
columns=["exposuredate", "min_exposure_date"])
df['datediff'] = pd.to_datetime(df.exposuredate) - pd.to_datetime(df.min_exposure_date)
exposuredate min_exposure_date datediff
0 2014-10-08 2014-09-27 11 days
1 2014-10-09 2014-09-27 12 days
2 2014-09-27 2014-09-27 0 days
3 2014-10-22 2014-09-27 25 days
解决方案:
df.datediff.apply(lambda x: x.days)
0 11
1 12
2 0
3 25
Name: datediff, dtype: int64