python - Pandas 使用另一列的值移动日期

标签 python date datetime pandas time-series

制作测试数据的代码:

 import pandas as pd
 df = pd.DataFrame({'A': pd.date_range(start='1-1-2016',periods=5, freq='M')})
 df['B'] = df.A.dt.month
 print(df)

数据看起来像

   B          A
0  1     2016-01-31
1  2     2016-02-29
2  3     2016-03-31
3  4     2016-04-30
4  5     2016-05-31

如何将 A 列作为 B 列的值向后移动月数

效果

 df['A'] - pd.DateOffset(months=value_from_column_B)

最佳答案

这是一种矢量化的方式来组合日期数组(NumPy datetime64s) 日期组件(如年、月、日):

import numpy as np
import pandas as pd

def compose_date(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)

df = pd.DataFrame({'A': pd.date_range(start='1-1-2016',periods=5, freq='M')})
df['B'] = df['A'].dt.month
df['C'] = compose_date(years=df['A'].dt.year, 
                       months=df['A'].dt.month-df['B'], 
                       days=df['A'].dt.day)
print(df)
#            A  B          C
# 0 2016-01-31  1 2015-12-31
# 1 2016-02-29  2 2015-12-29
# 2 2016-03-31  3 2015-12-31
# 3 2016-04-30  4 2015-12-30
# 4 2016-05-31  5 2015-12-31

In [135]: df = pd.DataFrame({'A': pd.date_range(start='1-1-2016', periods=10**3, freq='M')})

In [136]: df['B'] = df['A'].dt.month

In [137]: %timeit compose_date(years=df['A'].dt.year, months=df['A'].dt.month-df['B'], days=df['A'].dt.day)
10 loops, best of 3: 41.2 ms per loop

In [138]: %timeit df[['A', 'B']].apply(lambda x: x['A'] - pd.DateOffset(months=x['B']), axis=1)
10 loops, best of 3: 169 ms per loop

关于python - Pandas 使用另一列的值移动日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981977/

相关文章:

PHP获得明年同一周的同一天

python - 将变量从一个 python 脚本导入到另一个

python - Pandas 情节,结合两个情节

python - wxgrid 单元格渲染器设置列大小

javascript - Datetimepicker 不使用给定的格式

python - 列出时间格式的元素并计算与今天的时间差异

python - RuntimeError : 'list' must be None or a list, not <class 'str' > while trying to start celery worker

javascript - 比较日期字符串

mysql - 多个 MySQL DATETIME 列

javascript - 如何使用 JavaScript/Jquery 从字符串中获取所有日期和时间?