我有一個問題,我有一個包含 StartDate 和 EndDate 的 CSV 檔案,請考慮 01-02-2020 00:00:00 和 01-03-2020 00:00:00
我想要一個python程式,它可以找到日期之間的日期并附加到下一行,比如

所以在這里而不是 dot ,它應該增加 Startdate 并保持 End date 不變。
import pandas as pd
df = pd.read_csv('MyData.csv')
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
df['Dates'] = [pd.date_range(x, y) for x , y in zip(df['StartDate'],df['EndDate'])]
df = df.explode('Dates')
df
例如,如果我的 StartDate 為 01-02-2020 00:00:00 和 EndDate 為 05-02-2020 00:00:00
結果我應該得到

所有結果 DateTime 的格式應與 MyData.Csv StartDate 和 EndDate 中的格式相同
只有 StartDate 會改變,其余的應該是一樣的
我試著用日期范圍來做。但我沒有得到任何結果。誰能幫我解決這個問題。
謝謝
uj5u.com熱心網友回復:
我的兩分錢:一個非常簡單的解決方案,僅基于以下功能pandas:
import pandas as pd
# Format of the dates in 'MyData.csv'
DT_FMT = '%m-%d-%Y %H:%M:%S'
df = pd.read_csv('MyData.csv')
# Parse dates with the provided format
for c in ('StartDate', 'EndDate'):
df[c] = pd.to_datetime(df[c], format=DT_FMT)
# Create the DataFrame with the ranges of dates
date_df = pd.DataFrame(
data=[[d] list(row[1:])
for row in df.itertuples(index=False, name=None)
for d in pd.date_range(row[0], row[1])],
columns=df.columns.copy()
)
# Convert dates to strings in the same format of 'MyData.csv'
for c in ('StartDate', 'EndDate'):
date_df[c] = date_df[c].dt.strftime(DT_FMT)
如果df是:
StartDate EndDate A B C
0 2020-01-02 2020-01-06 ME ME ME
1 2021-05-15 2021-05-18 KI KI KI
那么date_df將是:
StartDate EndDate A B C
0 01-02-2020 00:00:00 01-06-2020 00:00:00 ME ME ME
1 01-03-2020 00:00:00 01-06-2020 00:00:00 ME ME ME
2 01-04-2020 00:00:00 01-06-2020 00:00:00 ME ME ME
3 01-05-2020 00:00:00 01-06-2020 00:00:00 ME ME ME
4 01-06-2020 00:00:00 01-06-2020 00:00:00 ME ME ME
5 05-15-2021 00:00:00 05-18-2021 00:00:00 KI KI KI
6 05-16-2021 00:00:00 05-18-2021 00:00:00 KI KI KI
7 05-17-2021 00:00:00 05-18-2021 00:00:00 KI KI KI
8 05-18-2021 00:00:00 05-18-2021 00:00:00 KI KI KI
然后,您可以使用該方法將結果保存回 CSV 檔案to_csv。
uj5u.com熱心網友回復:
這樣的事情能達到你想要的嗎?
from datetime import datetime, timedelta
date_list = []
for base, end in zip(df['StartDate'], df['EndDate']):
d1 = datetime.strptime(base, "%d-%m-%Y %H:%M:%S")
d2 = datetime.strptime(end, "%d-%m-%Y %H:%M:%S")
numdays = abs((d2 - d1).days)
basedate = datetime.strptime(base, "%d-%m-%Y %H:%M:%S")
date_list = [basedate - timedelta(days=x) for x in range(numdays)]
df['Dates'] = date_list
uj5u.com熱心網友回復:
實際上,您提供的代碼對我有用。我想您唯一需要更改的是讀寫操作中的日期格式,以確保符合您的要求。特別是,您應該dayfirst在讀取和date_format寫入輸出檔案時利用該引數。下面是一個玩具示例:
玩具資料
| 開始日期 | 結束日期 | 一個 | 乙 | C |
|---|---|---|---|---|
| 01-02-2020 00:00:00 | 06-02-2020 00:00:00 | 我 | 我 | 我 |
| 01-04-2020 00:00:00 | 04-04-2020 00:00:00 | 體育 | 體育 | 體育 |
示例代碼
import pandas as pd
s_dates = ['01-02-2020', '01-03-2020']
e_dates = ['01-04-2020', '01-05-2020']
df = pd.read_csv('dataSO.csv', parse_dates=[0,1], dayfirst=True)
cols = df.columns
df['Dates'] = [pd.date_range(x, y) for x , y in zip(df['StartDate'],df['EndDate'])]
df1 = df.explode('Dates')[cols]
df1.to_csv('resSO.csv', date_format="%d-%m-%Y %H:%M:%S", index=False)
StartDate除了也是日期時間格式的事實之外,輸出就是您所描述的。這能回答你的問題嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/412620.html
標籤:
下一篇:陣列中的例外值去除技術
