【问题标题】:Calculate a list of dates in Pandas column计算 Pandas 列中的日期列表
【发布时间】:2020-03-06 05:55:11
【问题描述】:

我有一个 Pandas 数据框,在日期时间中包含两个日期列。我想在这个日期范围内生成一个日期列表作为一个新列,这样我可以稍后将条目分解为多行。

我尝试了以下列表理解。

orders_df['list_of_dates'] = [orders_df['start_date'] + timedelta(days=n) for n in range(orders_df['date_difference'])]

但是收到了以下消息

TypeError: 'Series' 对象不能解释为整数

非常感谢您对解决方案的任何想法。

【问题讨论】:

  • 您应该在 for 循环的 range() 中使用系列形状

标签: python pandas list dataframe timedelta


【解决方案1】:

range 使用嵌套列表推导:

from datetime import timedelta

rng = pd.date_range('2017-04-03', periods=5)
orders_df = pd.DataFrame({'start_date': rng, 'date_difference': 2})  

orders_df['list_of_dates'] = [[d + timedelta(days=x) for x in range(n)] 
                                      for d, n 
                                      in zip(orders_df['start_date'],
                                             orders_df['date_difference'])]

print (orders_df)
  start_date  date_difference                               list_of_dates
0 2017-04-03                2  [2017-04-03 00:00:00, 2017-04-04 00:00:00]
1 2017-04-04                2  [2017-04-04 00:00:00, 2017-04-05 00:00:00]
2 2017-04-05                2  [2017-04-05 00:00:00, 2017-04-06 00:00:00]
3 2017-04-06                2  [2017-04-06 00:00:00, 2017-04-07 00:00:00]
4 2017-04-07                2  [2017-04-07 00:00:00, 2017-04-08 00:00:00]

如果还需要新列,可以使用Index.repeatGroupBy.cumcount 用于由to_timedelta 转换为timedeltas 的计数器系列:

df = orders_df.loc[orders_df.index.repeat(orders_df['date_difference'])]
g = df.groupby(level=0).cumcount()
df['new'] = df['start_date'] + pd.to_timedelta(g, unit='d')
df = df.reset_index(drop=True)
print (df)
  start_date  date_difference        new
0 2017-04-03                2 2017-04-03
1 2017-04-03                2 2017-04-04
2 2017-04-04                2 2017-04-04
3 2017-04-04                2 2017-04-05
4 2017-04-05                2 2017-04-05
5 2017-04-05                2 2017-04-06
6 2017-04-06                2 2017-04-06
7 2017-04-06                2 2017-04-07
8 2017-04-07                2 2017-04-07
9 2017-04-07                2 2017-04-08

【讨论】:

  • 嗨@jezrael,您的代码会生成一个金字塔的日期列表,而不管date_difference :(
  • @SomeBruh - 你使用最新版本吗?如果检查数据样本对我来说工作得很好。
  • 是的,将'date_difference': range(1,6) 替换为'date_difference': 0,你就会明白我的意思了
猜你喜欢
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
相关资源
最近更新 更多